Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当DataTemplate具有可见性绑定时,WPF ListBox自动宽度更改不正确_C#_Wpf_Xaml_Binding - Fatal编程技术网

C# 当DataTemplate具有可见性绑定时,WPF ListBox自动宽度更改不正确

C# 当DataTemplate具有可见性绑定时,WPF ListBox自动宽度更改不正确,c#,wpf,xaml,binding,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>

您所描述的这种效果与可见性绑定无关

本质上,我认为正在发生的是ListBox计算 它的所有子对象的大小决定它自身的大小,但仅限于 似乎要评估实际可用的控件的可见性绑定 在屏幕上(可能是出于性能原因)。结果是 它错误地计算了屏幕外子对象的大小, 为隐藏控件保留空间

这听起来对我来说是正确的。这样做是出于性能原因。也称为列表框的虚拟化。其他控件也继承了这一点,例如
DataGrid

为了摆脱它,您可以使用常用的stackpanel切换出
VirtualizingStackPanel

    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>


如果你有大量的物品,你可能会,也可能不会遭受性能损失,但这就是生活。如果你不喜欢这个,我建议你首先不要有这个要求

您所描述的这种效果与可见性绑定无关

本质上,我认为正在发生的是ListBox计算 它的所有子对象的大小决定它自身的大小,但仅限于 似乎要评估实际可用的控件的可见性绑定 在屏幕上(可能是出于性能原因)。结果是 它错误地计算了屏幕外子对象的大小, 为隐藏控件保留空间

这听起来对我来说是正确的。这样做是出于性能原因。也称为列表框的虚拟化。其他控件也继承了这一点,例如
DataGrid

为了摆脱它,您可以使用常用的stackpanel切换出
VirtualizingStackPanel

    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>


如果你有大量的物品,你可能会,也可能不会遭受性能损失,但这就是生活。如果你不喜欢这个,我建议你首先不要有这个要求

你是一位绅士和学者。这立刻解决了问题,谢谢!我真希望我四个小时前问过你,因为我带着这本书向各种各样的方向走去。你是一位绅士和学者。这立刻解决了问题,谢谢!我希望我四个小时前问过,因为我正带着这辆车向各种各样的危险方向驶去。