【问题标题】:WPF ListBox retain view on SelectedItem on change of StyleWPF ListBox 在样式更改时保留 SelectedItem 的视图
【发布时间】:2023-04-06 09:11:01
【问题描述】:

我有一个 ListBox,其样式和 ItemTemplate 在单击特定按钮时在代码隐藏中更改。

listbox.ItemTemplate = FindResource("dataTemplateView1") as DataTemplate;
listbox.Style = FindResource("listBoxStyle1") as Style;

共有三种可能的视图,因此有三组数据模板和样式。 DataTemplate 包含一些文本和缩略图(每组不同的大小)。样式只是将 ItemsPanelTemplate 更改为 WrapPanel、StackPanel(水平)和 StackPanel(垂直)。示例:

<Style x:Key="listBoxStyle1" TargetType={x:Type ListBox}">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
               <WrapPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

问题是当我有一个选定的项目(比如索引为 20 的项目)并且我更改视图时,显示的列表框的可见区域将重置回第一个索引(但选定的项目仍然被选中,只是未显示)。

我尝试使用解决方案 here 滚动到所选项目并将其设置为中心来解决此问题。但目前,有时这种行为似乎不稳定,因为列表框中的第一个项目首先显示,然后跳转到所选项目。还有其他替代方案吗?

谢谢!

【问题讨论】:

    标签: c# wpf listbox styles


    【解决方案1】:

    您要查找的内容与我在之前的回答中所写的内容并没有太大区别。

    两个区别是:

    1. 您的目标似乎是阻止当前项目移动,而不是让它移动到中心。这实际上是可能的,并且与居中一样简单。
    2. 您的代码的时序允许未滚动的版本暂时显示,导致跳跃。

    这两个问题可以一起解决如下(相关代码详情参考我之前的回答):

    1. 使用box.ItemContainerGenerator.ContainerFromItem(box.SelectedItem)获取物品容器
    2. 调用container.TransformToAncestor(box).Transform(new Point()) 获取容器相对于列表框的左上角。 (如果您希望项目的中心保持不动,请改用new Point(container.DesiredSize.Width/2, container.DesiredSize.Height/2)。)
    3. 根据需要更改 ItemTemplate 或 Style
    4. 强制立即重新测量(执行此操作的简单方法是调用 UpdateLayout)
    5. 再次使用box.ItemContainerGenerator.ContainerFromItem(box.SelectedItem)获取物品容器
    6. 再次调用container.TransformToAncestor(box).Transform(new Point())获取新容器相对于列表框的左上角
    7. 使用我的其他答案中的代码查找 IScrollInfo 并更新 Horizo​​ntalOffset 和 VerticalOffset 以将新容器带到与旧容器相同的位置。

    这将在没有闪烁的情况下工作的原因是这里的一切都是同步发生的,因此不会运行处于渲染优先级的调度程序操作。代价是 UpdateLayout() 比较昂贵。

    另请注意,如果您的任何单个项目的实现使其在初始测量/排列之后更改其大小(例如在调度程序回调中),那么您将需要重新定位两次:一次在同步代码中,然后再次在调度程序回调中。在这种情况下,我知道防止闪烁的唯一可靠的通用方法是修复项目的实现,以在初始布局完成之前获得它们的大小。

    【讨论】:

      【解决方案2】:

      这是一个口味问题,但我会触发可能 0.15 或 0.2 秒的淡出和淡入动画,并在淡出时执行模板切换。这将隐藏滚动并平滑布局中原本非常突然的切换。

      【讨论】:

        猜你喜欢
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多