GridViewColumn 调整大小不适用于 UserControl

问题描述 投票:0回答:1

我有一个 WPF ListView,它使用 GridViewColumns 作为其各个列。

<ListView Name="LvArticles"  Grid.Column="0" Grid.Row="3"  MinWidth="800" ItemsSource="{Binding SearchResults}" SelectedItem="{Binding SearchResultsSelectedItem}" IsSynchronizedWithCurrentItem="True" Margin="3">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="Distance" DisplayMemberBinding="{Binding Distance}"></GridViewColumn>
                <GridViewColumn Header="Ident" DisplayMemberBinding="{Binding Article.Ident}"></GridViewColumn>
                <GridViewColumn Header="Beschreibung">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate DataType="{x:Type models:ArticleSearchResult}">
                            <helpers:FormattedTextControl Text="{Binding Article.DescriptionLong2}" HighlightText="{Binding OriginalMpn}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch"  />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <!--<GridViewColumn Header="Beschreibung" DisplayMemberBinding="{Binding Article.DescriptionLong2}"></GridViewColumn>-->
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

如您所见,为了进行调试,我必须使用 GridViewColumns(当前已注释掉其中一个)来显示文本 Article.DescriptionLong2。

每当结果集发生变化时,我都会使用以下代码调整所有列的大小:

c.Width = 0; //set it to no width
c.Width = double.NaN; //resize it automatically

只要我使用 DisplayMemberBinding 行,这就有效。

现在我有一个自定义用户控件,基本上是这样构建的

<UserControl x:Class="GrafBomBuilder.Helpers.FormattedTextControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800" >
    <Grid Name="Stack" HorizontalAlignment="Stretch">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Text="{Binding Part1}" />
        <TextBlock Grid.Column="1" Text="{Binding Part2}" Foreground="Red" />
        <TextBlock Grid.Column="2" Text="{Binding Part3}" />
    </Grid>    

</UserControl>

如果我使用用户控件而不是 DisplayMemberBinding(后者应该只是 TextBlock),则列的大小将调整为标题宽度,而不是内容的宽度。虽然内容在那里,但看起来好像是 0。

我有一种感觉,在调整列大小之前,我需要以某种方式计算用户控件的实际大小?

这是正确的吗?我该怎么做呢?我有什么遗漏的吗?

wpf user-controls
1个回答
0
投票

在重新调整控件大小之前似乎没有生成视觉容器。我已将代码更改为以下内容,现在它按预期工作。

foreach (var item in LvArticles.Items)
{
    object viewItem = LvArticles.ItemContainerGenerator.ContainerFromItem(item);
    if (viewItem == null)
    {
        LvArticles.UpdateLayout();
        LvArticles.ItemContainerGenerator.ContainerFromItem(item);
    }
}

foreach (GridViewColumn c in ((GridView)LvArticles.View).Columns)
{
    c.Width = 0; //set it to no width
    c.Width = double.NaN; //resize it automatically
}

如果我理解正确的话,这会强制 UI 生成实际的表示。一旦表示存在,我们就可以成功计算列的大小。

© www.soinside.com 2019 - 2024. All rights reserved.