代码之家  ›  专栏  ›  技术社区  ›  Drew Noakes

wpf-如何阻止itemscontrol伪网格的列在布局期间跳舞/跳跃

  •  5
  • Drew Noakes  · 技术社区  · 15 年前

    Several other questions on SO 我也得出了同样的结论 ItemsControl 用一个 DataTemplate 对于每一个被构造为定位项以使其类似于网格的项,比使用 ListView .

    代码类似于:

    <StackPanel Grid.IsSharedSizeScope="True">
      <!-- Header -->
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" SharedSizeGroup="Column1" />
          <ColumnDefinition Width="Auto" SharedSizeGroup="Column2" />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Text="Column Header 1" />
        <TextBlock Grid.Column="1" Text="Column Header 2" />
      </Grid>
      <!-- Items -->
      <ItemsControl ItemsSource="{Binding Path=Values, Mode=OneWay}">
        <ItemsControl.ItemTemplate>
          <DataTemplate>
            <Grid>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Column1" />
                <ColumnDefinition Width="Auto" SharedSizeGroup="Column2" />
              </Grid.ColumnDefinitions>
              <TextBlock Grid.Column="0" Text="{Binding ColumnProperty1}" />
              <TextBlock Grid.Column="1" Text="{Binding ColumnProperty2}" />
            </Grid>
          </DataTemplate>
        </ItemsControl.ItemTemplate>
      </ItemsControl>
    </StackPanel>
    

    我看到的问题是每当我把 ItemsSource 被捆绑 ObservableCollection 我替换了对“网格”的引用,而不是清除并重新添加),整个“网格”在几秒钟内来回摆动。

    可能它正在做一些布局传递来获得所有 Auto -要匹配的宽度列。

    这对我的用户来说很分散注意力,我想把它解决掉。还有人看到这个吗?

    4 回复  |  直到 7 年前
        1
  •  1
  •   Beej    12 年前

    在这个问题出现之前,网格的内容似乎必须具有一定的复杂性。

    简单的textblock(如op所示)可能不会很容易地显示问题,因为它们是静态大小的。如果你扔一个 文本框 (不是文本块)在一个单元格中,然后在运行时,输入足够的文本以使文本框自动展开单元格,您应该会看到它立即开始狂舞……太过分了,不能接受。我的项目控件中有7行。

    这有效地使得到大力推广的isSharedSizeScope+itemsControl方法成为一种完全禁止的方法,特别是对于可编辑的、面向文本框的网格内容。

    为了满足我的需要,listview或者更确切地说是“itemscontrol+gridviewrowpresenter”方法 here here 是一个非常直接的选择,没有任何这些布局问题。

    对于那些问“为什么不使用数据网格?”:datagrid采用了某种编辑方法。我很愿意解决所有这些问题,但最终却陷入了一个死胡同:datagrid如何处理验证。错误支持。小的红色验证错误框对于简单的datagridtextcolumn很好,但是对于datagridtemplatecolumns(需要在一列中提供多个文本框),它最初会显示红色框,然后根据您单击的位置不一致地隐藏它们。数据网格。在随后的验证刷新时,它们将完全不可见。(旧示例: http://code.google.com/p/itraacv2-1/source/browse/trunk/scraps/tabSponsor%20-%20before%20deactive%20rewrite.xaml ,搜索“掘金:为了我可怕的生活”…)

    我的整个项目来源都是在线的。GridViewRowPresenter方法如下所示: http://code.google.com/p/itraacv2-1/source/browse/trunk/App/View/tabSponsor.xaml

        2
  •  1
  •   David    10 年前

    尝试在所有网格列上设置最小宽度。

    我也经历过这种神经质的不稳定。但是,我通过在所有网格列上指定一个集合minwidth来控制它。当屏幕第一次显示时,这似乎稳定了一些东西。当然,因为您的列仍然是链接的,所以它们会增长到任何控件获胜时的最大宽度。

    另外,关闭IsSharedSizeScope并尝试让网格先对齐,然后再重新打开。

        3
  •  0
  •   HolisticElastic    14 年前

    不幸的是,我无法用提供的代码重现问题。我试过交换20到1000个项目的样本,在集合中有100个不同的宽度。什么都没跳。在巨大的集合(200或更高)上,ui通常会挂起一段时间,然后释放,显示包含所提供项的新网格。

        4
  •  0
  •   Andreas Koder    8 年前

    我也遇到了同样的问题,我试着按照其中一个答案中的建议设置minwidth,但我没有成功。有帮助的是,将宽度从一个网格绑定到另一个网格。我在sharedsizegroup中保留了一些列,但没有跳转:

    <Grid Grid.IsSharedSizeScope="True">
    ...
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Group0"/>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Group1"/>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Group2"/>
                <ColumnDefinition Width="Auto" x:Name="Column3"/>
                <ColumnDefinition Width="Auto" x:Name="Column4"/>
                <ColumnDefinition Width="Auto" x:Name="Column5"/>
            </Grid.ColumnDefinitions>
        ...
        </Grid>
    
        <ItemsControl>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" SharedSizeGroup="Group0"/>
                            <ColumnDefinition Width="Auto" SharedSizeGroup="Group1"/>
                            <ColumnDefinition Width="Auto" SharedSizeGroup="Group2"/>
                            <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=Column3}"/>
                            <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=Column4}"/>
                            <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=Column5}"/>
                        </Grid.ColumnDefinitions>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    ...
    </Grid>
    

    我不知道sharedgroupsize可以保留多少列,还需要绑定多少列,所以您可以在这些列上玩,看看哪些适合您。