WPF弹出窗口,内容更改时ListView和GridView不调整大小
尽管搜索了类似的情况,但我找不到任何可以与根据内容自动调整弹出内容大小相媲美的东西 最终,我错过了一些明显的东西,但在创建之后,当内容发生变化时,我的弹出窗口仍然拒绝重新计算其大小和内容布局 更准确地说:我的弹出窗口包含一个列表视图,内容会动态变化 现在,当第一次创建弹出窗口时,它的宽度将适应ListView的所需大小,以便所有列表视图元素(在GridView中)都可以使用 现在,当ListView中的元素更新时,最长元素的宽度将更改。预期的行为是列表视图和弹出窗口将更改大小(宽度)以匹配新的列表元素 不幸的是,弹出窗口及其内容拒绝更改,因此内容被裁剪 我已经尝试使弹出式布局和度量无效,并调用弹出式布局和/或列表视图的UpdateLayout,但迄今为止没有成功。。。GridView元素我无法访问/管理它 有没有办法强制重新计算弹出窗口或列表视图的总体布局WPF弹出窗口,内容更改时ListView和GridView不调整大小,wpf,autolayout,popup,resize,Wpf,Autolayout,Popup,Resize,尽管搜索了类似的情况,但我找不到任何可以与根据内容自动调整弹出内容大小相媲美的东西 最终,我错过了一些明显的东西,但在创建之后,当内容发生变化时,我的弹出窗口仍然拒绝重新计算其大小和内容布局 更准确地说:我的弹出窗口包含一个列表视图,内容会动态变化 现在,当第一次创建弹出窗口时,它的宽度将适应ListView的所需大小,以便所有列表视图元素(在GridView中)都可以使用 现在,当ListView中的元素更新时,最长元素的宽度将更改。预期的行为是列表视图和弹出窗口将更改大小(宽度)以匹配新的
<Popup x:Name = "hintPopup"
Placement = "Bottom"
PlacementTarget = "{Binding ElementName=textBox}"
MinWidth = "{Binding ElementName=textBox, Path=ActualWidth}"
IsOpen = "{Binding ShowPopup, RelativeSource={RelativeSource AncestorType=ccont:vokDataGridEdit}}"
Margin = "0,20,0,0">
<!-- Reference a converter to convert Bool Values to Visibility -->
<Popup.Resources>
<conv:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
</Popup.Resources>
<!-- Move popup with anchor -->
<b:Interaction.Behaviors>
<behav:PopupAutoRepositionBehavior />
</b:Interaction.Behaviors>
<Border BorderBrush = "Gray"
BorderThickness = "1"
Background = "LightGray"
Padding = "1">
<StackPanel Orientation="Vertical">
<!-- Title Starts With -->
<TextBlock Text = "{x:Static res:Strings.vokDataGridEdit_Popup_TitleStartsWith}"
Visibility = "{Binding ShowHintsStartsWith, RelativeSource={RelativeSource AncestorType=ccont:vokDataGridEdit}, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=collapsed}"
FontWeight = "Bold"
Foreground = "Black"
Margin = "0, 5, 0, 2"/>
<!-- Hints -->
<ListView ItemsSource = "{Binding ItemHintsStartsWith, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=ccont:vokDataGridEdit}}"
Visibility = "{Binding ShowHintsStartsWith, RelativeSource={RelativeSource AncestorType=ccont:vokDataGridEdit}, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=collapsed}"
Margin = "5, 1, 1, 1">
<!-- Prevent selection -->
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Focusable" Value="false"/>
</Style>
</ListView.ItemContainerStyle>
<!-- Hide Headers -->
<ListView.Resources>
<Style TargetType="GridViewColumnHeader">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</ListView.Resources>
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridViewColumn DisplayMemberBinding = "{Binding Path=valueCurrent}"
Header = "Current"
Width = "auto" />
<GridViewColumn DisplayMemberBinding = "{Binding Path=valueTranslated}"
Header = "Translated"
Width = "auto" />
</GridView>
</ListView.View>
</ListView>
<!-- Title Similar -->
<TextBlock Text = "{x:Static res:Strings.vokDataGridEdit_Popup_Similar}"
Visibility = "{Binding ShowHintsSimilar, RelativeSource={RelativeSource AncestorType=ccont:vokDataGridEdit}, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=collapsed}"
FontWeight = "Bold"
Foreground = "Black"
Margin = "0, 5, 0, 2"/>
<!-- Hints -->
<ListView ItemsSource = "{Binding ItemHintsSimilar, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=ccont:vokDataGridEdit}}"
Visibility = "{Binding ShowHintsSimilar, RelativeSource={RelativeSource AncestorType=ccont:vokDataGridEdit}, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=collapsed}"
Margin = "5, 1, 1, 1">
<!-- Prevent selection -->
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Focusable" Value="false"/>
</Style>
</ListView.ItemContainerStyle>
<!-- Hide Headers -->
<ListView.Resources>
<Style TargetType="GridViewColumnHeader">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</ListView.Resources>
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridViewColumn DisplayMemberBinding = "{Binding Path=valueCurrent}"
Header = "Current"
Width = "auto" />
<GridViewColumn DisplayMemberBinding = "{Binding Path=valueTranslated}"
Header = "Translated"
Width = "auto" />
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</Border>
</Popup>
好的,最后我在项目中启用另一个
GridView
的ListView
时找到了解决方案。实际上,GridView
导致了这个问题,因为当绑定集合中的元素更改时,它不会自动调整列的大小
一、 因此,实现了一个行为
,每当列表视图
的集合绑定到更改时,该行为将触发一个调整大小事件:
//
///将自动调整大小添加到ListView GridViews列
///
公共类GridViewColumnAutoResizeBehavior:BehaviorBase
{
///
///设置行为
///
受保护的覆盖无效附加()
{
base.onatached();
//助理经办人
if(此.AssociatedObject?.Items为INotifyCollectionChanged notifyingCollection)
{
notifyingCollection.CollectionChanged+=this.OnCollectionChanged;
}
}
///
///处理程序强制调整列的大小
///
CollectionChanged的私有void(对象发送方,NotifyCollectionChangedEventArgs NotifyCollectionChangedEventArgs)
{
if(this.AssociatedObject.View是GridView GridView)
{
//调整自动列的大小
foreach(gridView.Columns.Where(column=>double.IsNaN(column.Width))中的gridView列gridView列)
{
gridViewColumn.Width=gridViewColumn.ActualWidth;
gridViewColumn.Width=double.NaN;
}
}
}
///
///清理行为
///
受保护的覆盖void OnCleanup()
{
//清理处理器
if(此.AssociatedObject?.Items为INotifyCollectionChanged notifyingCollection)
{
notifyingCollection.CollectionChanged-=this.OnCollectionChanged;
}
base.OnCleanup();
}
}
确保使用实现了INotifyCollectionChanged
的集合来附加行为
代码使用自动分离行为,因此您需要适应正在使用的基类,这应该是直接的