5

关于SO的其他 几个问题 也得出了与我相同的结论——对构建的每个项目使用 a来定位项目,使其类似于网格比使用 a 简单得多(尤其是格式化)。 ItemsControlDataTemplateListView

代码类似于:

<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-width 列匹配。

这对我的用户来说非常分散注意力,我想解决它。有没有其他人看过这个?

4

4 回答 4

1

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

OP 中显示的简单文本块可能不会那么容易地表现出问题,因为它们是静态大小。如果你在一个单元格中抛出一个TextBox(不是 TextBlock),然后在运行时,输入足够的文本以使 TextBox 自动扩展单元格,你应该会看到它立即开始疯狂地跳舞......它也很好 -非常可接受的路线。我的 ItemsControl 中有 7 行。

这有效地使大肆推广的 IsSharedSizeScope + ItemsControl 方法完全不可行,特别是对于可编辑的、面向文本框的网格内容。

对于我的需要,此处此处介绍的 ListView 或更确切地说是“ItemsControl + GridViewRowPresenter”方法是一种非常直接的替代方法,并且没有任何这些布局问题。

对于那些问“为什么不是 DataGrid?”的人:DataGrid 采用了某种编辑方法。我愿意完成所有这些工作,但由于 DataGrid 如何破坏 Validation.Error 支持而陷入了死胡同。红色的小验证错误框对于简单的 DataGridTextColumn 可以正常工作,但对于 DataGridTemplateColumns(需要在一列中提供多个文本框),它最初会显示红色框,然后根据您碰巧单击的位置不一致地隐藏它们数据网格。在随后的验证刷新时,它们将完全不可见。(旧示例:http ://code.google.com/p/itraacv2-1/source/browse/trunk/scraps/tabSponsor%20-%20before%20deactive%20rewrite.xaml ,向下搜索“nugget:for the friggin我的生活”...)

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

于 2011-06-24T07:46:22.910 回答
1

尝试在所有网格列上设置 MinWidth。

我也经历过这种跳动的不稳定性。但是,我通过在所有网格列上指定一组 MinWidth 来控制它。当屏幕首次显示时,这似乎可以稳定事情。当然,因为您的列仍然是链接的,所以它们会增长到任何控件获胜的最大宽度。

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

于 2013-11-26T01:50:14.050 回答
0

不幸的是,我无法使用提供的代码重现问题。我已经尝试过交换 20 到 1000 个项目的样本,并且集合中有 100 种不同的宽度。什么都没有跳舞。在大型集合(200 及更高)上,UI 过去会挂起一段时间然后释放,显示带有所提供项目的新网格。

于 2009-11-22T18:42:30.497 回答
0

我遇到了同样的问题,我尝试像其中一个答案中建议的那样设置 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 留下多少列以及需要绑定多少列,因此您可以使用这些列来查看哪些对您有用。

于 2015-11-04T09:13:37.573 回答