我有一个 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。
我有一种感觉,在调整列大小之前,我需要以某种方式计算用户控件的实际大小?
这是正确的吗?我该怎么做呢?我有什么遗漏的吗?
在重新调整控件大小之前似乎没有生成视觉容器。我已将代码更改为以下内容,现在它按预期工作。
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 生成实际的表示。一旦表示存在,我们就可以成功计算列的大小。