gpt4 book ai didi

c# - 带有 SharedSizeGroup 列的网格表现得很奇怪(*不是*无限循环)

转载 作者:太空狗 更新时间:2023-10-29 20:34:47 25 4
gpt4 key购买 nike

如果您在上面的 ItemsControl 下面运行示例窗口,将更新布局几秒钟,直到最后所有列都具有正确的宽度(正确 = 与下面的 ItemsControl 中的列相同)。

您可以更改窗口的宽度并水平和垂直滚动环绕 ScrollViewer 的下方 ItemsControls -- 但是只要您更改窗口的高度,布局就会翻转几秒钟。

注意:不存在像其他问题那样的大小模糊问题,其中网格会无限更新大小。

是我做错了什么——如果是,我该如何解决? -- 或者我应该将此问题发布到 Microsoft-Connect?

代码隐藏:

namespace DynamicGridColumnBinding
{
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Controls;

public partial class MainWindow
{
private static readonly CultureInfo[] cultureInfos =
CultureInfo.GetCultures(CultureTypes.NeutralCultures).Take(15).ToArray();

public MainWindow()
{
this.InitializeComponent();
}

public static IEnumerable<CultureInfo> AllCultures
{
get { return cultureInfos; }
}

private void GridInitialized(object sender, EventArgs e)
{
var grid = (Grid)sender;
for ( int i = 0; i < cultureInfos.Length; i++ )
grid.ColumnDefinitions.Add(new ColumnDefinition
{
Width = GridLength.Auto,
SharedSizeGroup = "g" + i,
});
}

private void ScrollViewerScrollChanged(object sender, ScrollChangedEventArgs e)
{
if ( e.HorizontalChange != 0 )
this.legendScroller.ScrollToHorizontalOffset(e.HorizontalOffset);
}
}
}

Xaml:

<FrameworkElement.Resources>
<ItemsPanelTemplate x:Key="panelTemplate">
<Grid Initialized="GridInitialized" />
</ItemsPanelTemplate>

<Style TargetType="ContentPresenter" x:Key="containerStyle">
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource Self}, Path=(ItemsControl.AlternationIndex)}" />
<Setter Property="Grid.Column" Value="{Binding RelativeSource={RelativeSource Self}, Path=(ItemsControl.AlternationIndex)}" />
</Style>

<Style TargetType="TextBlock" x:Key="textStyle">
<Setter Property="Padding" Value="5" />
<Setter Property="Background" Value="Lime" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</FrameworkElement.Resources>

<DockPanel Grid.IsSharedSizeScope="True" DataContext="{Binding Source={x:Static local:MainWindow.AllCultures}}">

<ScrollViewer DockPanel.Dock="Top" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled"
x:Name="legendScroller">
<ItemsControl ItemsSource="{Binding}" AlternationCount="{x:Static System:Int32.MaxValue}" Margin="0 0 500 0"
ItemsPanel="{StaticResource panelTemplate}" ItemContainerStyle="{StaticResource containerStyle}">

<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type glob:CultureInfo}">
<GroupBox Header="{Binding Name}" HeaderStringFormat="[ {0} ]">
<TextBlock Style="{StaticResource textStyle}"
Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=ContentPresenter, AncestorLevel=2}}" />
</GroupBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>

<TextBlock Foreground="Red" DockPanel.Dock="Top" Margin="0 10" FontSize="20" Text="some random arbitrary content in between" />

<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto" ScrollChanged="ScrollViewerScrollChanged">
<ItemsControl ItemsSource="{Binding}" AlternationCount="{x:Static System:Int32.MaxValue}"
ItemsPanel="{StaticResource panelTemplate}" ItemContainerStyle="{StaticResource containerStyle}">

<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type glob:CultureInfo}">
<Border Background="DodgerBlue" Padding="5" Margin="1">
<GroupBox Header="{Binding DisplayName}">
<TextBlock Style="{StaticResource textStyle}" Padding="5 100"
Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=ContentPresenter, AncestorLevel=2}}" />
</GroupBox>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>

</DockPanel>

顺便说一句:如果您强制为上层 ItemsControl 的项目指定大小(通过将 MinWidth="200" 添加到 GroupBox),那么下层 ItemsControl 将变得愚蠢。

BTW2:从大约开始。 8 个共享大小的列(在示例中有 15 个,由 .Take(15) 控制)你会看到重新排列出现,并且随着你添加的每一列它的时间加倍 - 所以几乎有 20 列几分钟都不会结束。

BTW3:在 3 个月内没有收到一条评论是非常令人沮丧的。

最佳答案

有趣的是,三个月前我对这个问题 +1,但没有回答。您没有收到回复的原因可能是因为它很难!

我现在仍然没有太多要说的,除了 WPF 布局是在两次传递中执行的 - 测量和排列 - 元素的后续大小调整可能会触发其他元素上的布局等......

为了正确调整列的大小,WPF 正在做这样的事情:

  • 测量第 1 列的内容
  • 排列第 1 列的内容
  • 衡量第 2 列的内容
    • 等一下,第 2 列比预期的要大
    • 对第 1 列的所有内容触发测量
      • 排列第 1 列的内容
      • 测量第 2 列的内容

...等等

为我的简单观点道歉。您有多少列(因此共享大小组的数量)?另一个问题。您运行的是什么操作系统和 .NET Framework?例如,我听说在 WindowsXP 上的 WPF 中可以拥有的 SharedSizeGroups 数量有限制。不确定它是否在以后的操作系统中得到修复。

作为解决方法,您可以自己实现此行为吗?这意味着您可以制作自己的附加属性来测量网格中的每个元素(所有列,所有行)然后设置每列的大小一次吗?而不是逐列的基础。

问候,

关于c# - 带有 SharedSizeGroup 列的网格表现得很奇怪(*不是*无限循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8859277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com