自定义 WPF 控件

发布于 2024-10-30 12:10:05 字数 418 浏览 1 评论 0原文

我正在 WPF 4.0 中创建一个自定义控件,如下图所示。它基本上由“泳道”组成。每个 ItemsControl 都具有可拖放的元素,并具有项目的视觉呈现,位于除行标题之外的每个元素的同一行中。有固定数量的列和可变数量的行。

在此处输入图像描述

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

  1. 使用 DataGrid 并对其进行大量修改,以便它将支持这种行为。

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

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

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

有什么不清楚的地方请评论!

I am creating a custom control in WPF 4.0 that is going to look something like the image below. It basically consists of "swim lanes". Each ItemsControl has elements that can be dragged and dropped, with a visual render of the item, within the same row on every element except for the row header. There are a fixed number of columns and a variable number of rows.

enter image description here

I was thinking of two different approaches to this problem:

  1. Use a DataGrid and heavily modify it so that it will support this behaviour.

  2. Create a grid with a dynamic number of rows and implement each item as group of 5 controls (one for each column).

Considerations:
Using MVVM, the whole thing should be able to bind to a list.

What would be the most reasonable approach in this situation?

Please comment if anything is unclear!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

盛装女皇 2024-11-06 12:10:05

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

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

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

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

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

正如 Zebi 指出的那样,此时使用 DataGrid 实际上可能并不太难。

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

So it sounds like you have several "controls" that you should build that will make this larger, composite control easier to manage.

The bulk of the complicated behavior you have is enforcing drag and drop across items controls within a given row (really the complicated part is restricting drops on items controls in other rows)

So first I would build a ItemsControlGroup control. Something similar to say a radio group where each control is part of a similar group. You might be able to do this with simply an attached property for the group name. That will give you a way to figure out if the target is a valid drop location for the given item being dragged.

Building all of that should be distinct from building this "swim lane" layout you are after.

Once you have the items control drag and drop working then you can build the layout several different ways.

A DataGrid actually might not be too hard to work with at this point, like Zebi pointed out.

You could also get away with a set of nested stack panels or some sort of grid layout. Layout will be the easy part.

笑叹一世浮沉 2024-11-06 12:10:05

如果您想使用 wpf 数据网格,那么如果您使用 TemplateColumn 作为第 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。

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

If you want to use a wpf datagrid it's not hard to achieve your desired layout if you use TemplateColumns for your columns 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>

Items source for the grid can be a simple List/ObservableCollection.

However, you will still have to implement a drag&drop mechanism yourself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文