wwa*_*rby 1 c# wpf xaml binding
我有一个 ListBox 停靠在窗口的左侧,其宽度应与其内容大小相符。当我滚动列表框时,它的宽度会摆动并变得比应有的更宽。基本上我认为正在发生的是 ListBox 计算它所有子项的大小以确定它自己的大小,但似乎只评估实际在屏幕上的控件的可见性绑定(大概是出于性能原因)。结果是它错误地计算了屏幕外子项的大小,为隐藏控件保留了空间。
如果列表中的项目少于窗口高度(因此没有滚动条),则列表始终具有正确的宽度,并且当您滚动到顶部或底部时,它始终对齐到正确的宽度。只有当滚动条位于两者之间时,宽度才错误。
我整个晚上都在努力解决这个问题,尝试了各种重构,比如使用 DataTemplateSelector 来抽象出对可见性绑定的需求,但我最终得到了我不满意的非常肮脏的解决方法。我想解决手头的实际问题而不是躲避它。任何指针将不胜感激。
在以下示例中,列表的大小似乎与 Foo 和 Bar 的宽度相同。更改 StackPanel 方向会使其大小调整为 Foo 和 Bar 中较长者的宽度。希望这是有道理的。
<ListBox ItemsSource="{Binding Widgets}" DockPanel.Dock="Left">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Visibility="{Binding ShowFoo, Converter={StaticResource BoolToVisConverter}}" Text="{Binding Foo}" />
<TextBlock Visibility="{Binding ShowBar, Converter={StaticResource InverseBoolToVisConverter}}" Text="{Binding Bar}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
您所描述的这种效果与可见性绑定无关。
基本上我认为正在发生的是 ListBox 计算它所有子项的大小以确定它自己的大小,但似乎只评估实际在屏幕上的控件的
可见性绑定(大概是出于性能原因)。结果是它错误地计算了它的屏幕外子项的大小,为隐藏控件保留了空间。
这对我来说听起来是正确的。这样做是出于性能原因。也称为ListBox. 其他控件也继承了这一点,例如DataGrid.
为了摆脱它,您可以VirtualizingStackPanel使用通常的堆栈面板切换:
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
Run Code Online (Sandbox Code Playgroud)
如果您有大量的项目,您可能会,也可能不会遭受性能损失,但这就是生活。如果你不喜欢这个,我建议你首先不要有这个要求。