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

时间:2014-05-07 17:34:05

标签: c# wpf data-binding .net-4.0

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

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

我想我可以将ItemWidth数据绑定到WrapPanel的子节点,以便提取每个项目的宽度(并找到最大宽度,并将其用作ItemWidth等),但我很谨慎这样做是因为数据可能绑定到错误的东西。就像在,绑定到ItemWidth更改时更改的内容,导致无限循环(或者至少是循环重复次数超过必要的循环。

设置此项的最佳方法是什么,以便ItemWidth仅为防止截断所需的大小?

编辑:

我想保留WrapPanel提供的功能,允许存在可变数量的项目列,具体取决于WrapPanel本身允许的空间。

3 个答案:

答案 0 :(得分:9)

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

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

<WrapPanel Grid.IsSharedSizeScope="True">

然后,您将每个项目包装在使用Grid属性的单个单元格SharedSizeGroup中,告诉他们所有项目共享大小

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition SharedSizeGroup="SharedGroup" />
    </Grid.ColumnDefinitions>
    <ContentPresenter />
</Grid>

如果你想要一个例子,快速谷歌搜索给了我this answer,其中包含一个代码示例。

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

答案 1 :(得分:1)

尝试以下方法。需要注意的部分是Grid.IsSharedSizeScope =&#34; True&#34;在包装面板和列定义的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>

答案 2 :(得分:0)

尝试将itemwidth属性设置为Auto ...请参阅此处:

http://msdn.microsoft.com/en-us/library/system.windows.controls.wrappanel.itemwidth(v=vs.110).aspx

以编程方式执行此“宽度设置”,您可以在渲染控件后执行以下操作。

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;


}