- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果您在上面的 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 正在做这样的事情:
...等等
为我的简单观点道歉。您有多少列(因此共享大小组的数量)?另一个问题。您运行的是什么操作系统和 .NET Framework?例如,我听说在 WindowsXP 上的 WPF 中可以拥有的 SharedSizeGroups 数量有限制。不确定它是否在以后的操作系统中得到修复。
作为解决方法,您可以自己实现此行为吗?这意味着您可以制作自己的附加属性来测量网格中的每个元素(所有列,所有行)然后设置每列的大小一次吗?而不是逐列的基础。
问候,
关于c# - 带有 SharedSizeGroup 列的网格表现得很奇怪(*不是*无限循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8859277/
我的 WPF 应用程序上有一个 DataGrid 和一个网格,我希望它们受尊重的列大小相同。我想也许我使用 SharedSizeGroup 但似乎 DataGrid 列没有这个属性(我错了吗?)。 我
我希望使用网格作为我的顶级布局。网格将有 1 列和 n 行。网格中的每一行还应包含一个 3 列 1 行的网格。第二列是 GridSplitter,我尝试使用 SharedSizeGroup,以便更改所
所以,我有 3 个用户控件: 1。 SectionV.xaml ... ... ... 2。 BarV.xaml ...
两个包含以某种方式指定的元素的网格和 SharedSizeGroup 似乎有点问题。 这个问题是对 earlier question 的回应。来自 user D.H.我试图回答。原谅长度,但它有助于直
如果您运行此代码并单击选项卡 2,然后返回选项卡 1,应用程序就会变得疯狂并开始来回弹跳列宽。关于如何解决这个问题有什么建议吗?
我需要带有水平和垂直标题的表格(简单的 PivotGrid)。我在这里发现了一些类似(或几乎相同)的问题,但没有人给出解决方案。在 XAML 中我定义了这个结构:
我有以下 xaml:
没有Grid.SharedSizeGroup在 Silverlight 4 中。您对此问题的解决方法是什么? 例如:我有一个 DataTemplate为 ListBox.ItemTemplate由具有
我试图弄清楚 Grid 如何在其列和行中进行大小共享。我正在使用 Reflector 查看网格代码,但找不到任何匹配项。 cols/rows 共享大小应该首先获得所需的大小,然后使用最大找到的大小再次
我有一个用户控件,称之为UserControl,它有一个带有以下列定义的网格:
我使用代表国家/地区的 ItemsControl。对于每个国家,我使用 ListView 来显示其城市:
如果您在上面的 ItemsControl 下面运行示例窗口,将更新布局几秒钟,直到最后所有列都具有正确的宽度(正确 = 与下面的 ItemsControl 中的列相同)。 您可以更改窗口的宽度并水平和
当我在列上同时使用 SharedSizeGroup 和列跨越控件创建网格时,网格会“精神上”晃动并使 cpu 内核达到最大。 我敢肯定一定有一个很好的理由说明为什么这行不通,但我想不出!我还能如何实现
我遇到了与以下旧论坛帖子中所述相同的问题:Issue on MSDN 但是,出于某种原因,Microsoft 决定删除此处描述的答案中的功能。 我正在寻找的是一个 ListView 有 2+ 列,第一
我是一名优秀的程序员,十分优秀!