C# WrapPanel:尝试使ItemWidth等于任何一个元素的最大宽度

C# WrapPanel:尝试使ItemWidth等于任何一个元素的最大宽度,c#,wpf,data-binding,.net-4.0,C#,Wpf,Data Binding,.net 4.0,希望没有其他人问过这个问题,但我已经搜索过了,找不到任何提及。如果我错过了另一个解释这个问题的问题,请随时为我指出正确的方向 我有一个带有数据绑定项的包装,基本上包含一个图标和一些可变长度的文本(这是图表的图例)。我真的很喜欢当我将ItemWidth设置为某个设置值时,项目以整齐的列显示。然而,由于每个项目中文本长度的高度可变性,我无法轻松选择一个适用于所有情况的特定值。也就是说,在某些情况下,所有项目的文本都可能很短,因此ItemWidth的值越小越好。但在其他情况下,如此小的ItemWidt

希望没有其他人问过这个问题,但我已经搜索过了,找不到任何提及。如果我错过了另一个解释这个问题的问题,请随时为我指出正确的方向

我有一个带有数据绑定项的包装,基本上包含一个图标和一些可变长度的文本(这是图表的图例)。我真的很喜欢当我将ItemWidth设置为某个设置值时,项目以整齐的列显示。然而,由于每个项目中文本长度的高度可变性,我无法轻松选择一个适用于所有情况的特定值。也就是说,在某些情况下,所有项目的文本都可能很短,因此ItemWidth的值越小越好。但在其他情况下,如此小的ItemWidth会导致某些项目中的文本被截断

我想我可以以某种方式将ItemWidth数据绑定到WrapPanel的子项,以提取每个项的宽度(并找到最大宽度,并将其用作ItemWidth等),但我对这样做持怀疑态度,因为可能会将数据绑定到错误的对象。与中一样,绑定到ItemWidth更改时更改的内容,导致无限循环(或者至少是重复次数超过必要次数的循环)

设置此项的最佳方法是什么,以使ItemWidth仅与防止截断所需的大小相同

编辑:


我想保留WrapPanel提供的功能,该功能允许根据WrapPanel本身允许的空间,有可变数量的项目列。

尝试将itemwidth属性设置为Auto…请参见此处:

要以编程方式执行此“宽度设置”,可以在呈现控件后执行以下操作

protected override void OnRender(DrawingContext dc)
{

int largest = 0;
foreach(UIElement child in this.myWrapPanel.Children)
{
    if(child.Width>largest)
        largest = child.Width;
}

this.myWrapPanel.ItemWidth = largest;


}

尝试以下操作。要注意的部分是包装面板上的Grid.IsSharedSizeScope=“True”和列定义的SharedSizeGroup属性

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <WrapPanel Grid.IsSharedSizeScope="True">
            <WrapPanel.Resources>
                <Style TargetType="TextBlock">
                    <Setter Property="Padding" Value="2" />
                    <Setter Property="HorizontalAlignment" Value="Center" />
                </Style>
            </WrapPanel.Resources>
            <WrapPanel.Children>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="abcdefghijklmnopqrstuvwxyz" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="1234567890" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="abcdefghijklmnopqrstuvwxyz" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="1234567890" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="abcdefghijklmnopqrstuvwxyz" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="1234567890" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="abcdefghijklmnopqrstuvwxyz" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="1234567890" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="abcdefghijklmnopqrstuvwxyz" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="1234567890" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="abcdefghijklmnopqrstuvwxyz" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="1234567890" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="abcdefghijklmnopqrstuvwxyz" />
                </Grid>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="group1" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="1234567890" />
                </Grid>
            </WrapPanel.Children>
        </WrapPanel>
    </Grid>
</Window>

您可以将每个项目包装在
网格中,并使用网格的
ShareSizeScope
属性确保所有项目共享相同的宽度

例如,在WrapPanel上,您可以将
Grid.IsSharedSizeScope
设置为true

<WrapPanel Grid.IsSharedSizeScope="True">
如果你想要一个例子,谷歌快速搜索给了我一个包含代码的例子


如果您有大量数据,我也建议您进行性能测试。

重复问题?@J.H:我想要的是列数可变的功能,而不是固定的功能。该功能在包装中容易,在网格中难(据我所知)。也许我遗漏了一些东西,但……是的,这就是它的工作原理。我将发布一个带有xaml标记的答案,以便您可以自己尝试。您的包装面板子项由一个单元格网格组成。您的真实内容放在单个单元格网格中。我不知道-必须是网格。您可能会得到类似MaxOvrdrv所说的内容t working——循环遍历子项,获得最大大小,将其应用于wrap panel ItemWidth。不过,我宁愿使用网格,除非性能有问题。将文本包装到多行。设置为“自动”将删除“漂亮整洁的列”我在我的问题中明确提到了。这不是一个解决方案。在这种情况下,您正在寻找代码来循环每个列,获取其宽度,比较看它是否是最大的,当您的循环完成,并且您拥有最大的一个时,将您的包装面板项目宽度设置为最大的一个…除了fo之外,没有其他选项了r是编程的。如果你想知道如何做到这一点,我可以发布它?@MaxOrdrv:Huh?WrapPanels没有定义的列。这些列是隐式显示的,因为ItemWidth是如何使用的以及包装是如何发生的。如果我使用了网格,我可以想象动态选择我想要多少列,等等。OnRender是什么u重写?如果我必须使用WrapPanel作为另一个对象的ItemsPanel,或者如果我必须在多个位置使用WrapPanel,那么这将不会很好地工作。其他解决方案看起来更优雅。我想我错过了您正在工作的部分
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition SharedSizeGroup="SharedGroup" />
    </Grid.ColumnDefinitions>
    <ContentPresenter />
</Grid>