【问题标题】:Custom WPF control自定义 WPF 控件
【发布时间】:2011-04-06 04:50:36
【问题描述】:

我正在 WPF 4.0 中创建一个自定义控件,它看起来类似于下图。它基本上由“泳道”组成。每个 ItemsControl 都有可以拖放的元素,并带有项目的可视化呈现,位于每个元素的同一行中,行标题除外。列数固定,行数可变。

我正在考虑两种不同的方法来解决这个问题:

  1. 使用 DataGrid 并对其进行大量修改,使其支持此行为。

  2. 创建具有动态行数的网格,并将每个项目实现为一组 5 个控件(每列一个)。

注意事项: 使用 MVVM,整个东西应该能够绑定到一个列表。

在这种情况下,最合理的方法是什么?

如果有不清楚的地方请评论!

【问题讨论】:

  • 我不会使用涉及太多黑客攻击 IMO 的 DataGrid。当您说它们可以拖放时,您的意思是给定行中的现有项目可以在该行中重新排序?
  • 完全正确,并且还在每个单元格中的一个项目控件中排序。
  • 哦,好吧,我没有意识到每个单元格都是它自己的项目控件。现在我回头看这张图就更有意义了。立即制定答案
  • 我很想帮忙,但是我不明白什么可以拖放。能举个例子吗?
  • @Philipp 一些带有一些文本块和一些按钮的用户控件,不过我知道如何实现这种拖放。

标签: c# wpf mvvm .net-4.0 custom-controls


【解决方案1】:

所以听起来您应该构建几个“控件”,这将使这个更大的复合控件更易于管理。

您所拥有的大部分复杂行为是在给定行内的项目控件之间强制拖放(实际上,复杂的部分是限制对其他行中的项目控件的拖放)

所以首先我会构建一个 ItemsControlGroup 控件。类似于说一个无线电组,其中每个控件都是类似组的一部分。您可能只需为组名添加一个附加属性即可完成此操作。这将为您提供一种方法来确定目标是否是正在拖动的给定项目的有效放置位置。

构建所有这些应该不同于构建您所追求的“泳道”布局。

一旦您让项目控件拖放工作,您就可以通过几种不同的方式构建布局。

正如 Zebi 指出的那样,在这一点上,实际上使用 DataGrid 可能并不难。

您还可以使用一组嵌套的堆栈面板或某种网格布局。布局将是最简单的部分。

【讨论】:

  • 哈,我有这个回答同样的事情:)
【解决方案2】:

如果您想使用 wpf 数据网格,如果您将 TemplateColumns 用于列 2-5,那么实现您想要的布局并不难:

<dg:DataGridTemplateColumn Header="....">
    <dg:DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <!-- your custom control -->
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellEditingTemplate>
    <dg:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <!-- ... -->
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>

网格的项目源可以是简单的 List/ObservableCollection。

但是,您仍然需要自己实现拖放机制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多