【问题标题】:WPF - Panel with expandable control for chopped elementsWPF - 具有可扩展控制切碎元素的面板
【发布时间】:2015-01-06 11:09:56
【问题描述】:

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

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

我现在的实现是使用自定义面板,其中切碎的元素通过属性“SpillOverElements”分发。我想将另一个控件(面板、扩展器或弹出窗口)绑定到此属性。问题是我无法绑定到 ItemsControl 内“SpillOverPanel”的“SpillOverElements”属性。

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

所以问题是我如何绑定到“SpillOverPanel”的“SpillOverElements”属性。也欢迎任何其他如何实现这一点的想法。我不确定我的方法是否正确。

提前感谢您的帮助!

【问题讨论】:

  • 为什么不扔掉StackPanel 并使用Grid 将显示ScrollBar 以使用户能够滚动到隐藏控件?
  • 有点骇人听闻,但您能否将 SpillOverElements 属性绑定到 ItemsControl.Tag 属性(通过 RelativeSource)。然后你可以将你的 StackPanel 绑定到那个。

标签: c# wpf mvvm panel


【解决方案1】:

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

一个单一的、可重用的 ItemsControl 类

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

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

您的 SpilloverItemsControl 类将被布置为一种复合控件,在其 ControlTemplate 中提供 2 个不同的 ItemsControl - 如果“IsSpilledOver”设置为“false”,则其项目的 Visibility 将设置为 Visible,并设置为“Collapsed” ' 如果不;另一个用作“溢出”区域,它将仅显示“IsSpilledOver”设置为 true 的项目。

另一种方法

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2020-07-24
    相关资源
    最近更新 更多