WPF - 具有用于切碎元素的可扩展控件的面板

本文关键字:可扩展 控件 元素 用于 WPF | 更新日期: 2023-09-27 18:36:28

我有一个具有可最小化控件的应用程序。最小化的项目显示在水平堆栈面板中。在调整应用程序项目的大小(缩小)时,由于空间太小,可能会被砍掉。
为了避免这种情况,我的想法是将切碎的元素移动到可扩展的控件(像这样)

应用程序遵循 MVVM 模式,面板中的项位于绑定到视图模型的 ItemsControl 中。

我现在的实现是使用自定义面板,其中切碎的元素与属性"溢出元素"一起分发。我想将另一个控件(面板、展开器或弹出窗口)绑定到此属性。问题是我无法绑定到项目控件中"溢出面板"的"溢出元素"属性。

<ItemsControl>
    ItemTemplate="{StaticResource DummyContentDataTemplate}"
    ItemsSource="{Binding DisplayElementsCollection}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <local:SpillOverPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
</ItemsControl>  

所以问题是我如何绑定到"溢出面板"的"溢出元素"属性。也欢迎任何其他如何实现这一点的想法。我不确定我的方式是否正确。

提前感谢您的帮助!

WPF - 具有用于切碎元素的可扩展控件的面板

原谅我,下面的文字中有很多吐槽。

单个可重用项控件类

这可能是一个相当复杂的实现。 您可能需要以"溢出项控件"类和"溢出项"类的形式创建全新的 WPF 控件,以用作溢出控件中显示的项的项容器。 类当然会继承自 ItemsControl。

SpilloverItem 容器将公开一个属性 - "IsSpilledOver"(或类似内容),父控件将根据各种大小和可见性计算自动将其设置为 truefalse

您的 SpilloverItemsControl 类将作为一种复合控件进行布局,在其 ControlTemplate 中提供 2 个不同的 ItemsControls - 如果"IsSpilledOver"设置为"false",则其项的可见性将设置为"可见",如果不是,则设置为"折叠";另一个用作"溢出"区域,它将仅显示将"IsSpilledOver"设置为 true 的项。

替代方法

另一种方法(但可重用性稍低)是让"IsSpilledOver"属性存在于项目 ViewModel,并创建一个最小行为来确定何时应将其设置为 true 或 false。 然后,在您的视图中,您将再次将两个不同的 ItemsControls 绑定到同一集合。 一个用于显示"非溢出"项目,另一个用于显示"溢出"项目。 此处的可见性将在您的 ItemTemplate 中设置。