WPF - 创建要在画布上使用的简单控件

Posted

技术标签:

【中文标题】WPF - 创建要在画布上使用的简单控件【英文标题】:WPF - Creating simple controls to be used on a Canvas 【发布时间】:2010-11-26 12:50:12 【问题描述】:

我正在为图像后处理开发一个简单的 WPF UI。

我想创建一个可拖动的 WPF 控件,以在 Canvas 上使用,大致如下所示:

http://img32.imageshack.us/img32/884/photoeditor.png http://img32.imageshack.us/img32/884/photoeditor.png

两个端点椭圆都是可拖动的,连接它们的线会随着端点的移动而跟随。

现在,我知道如何实现这一点,只需将这些元素添加到 Canvas 中,然后实现必要的事件处理以使元素在被拖动时移动。但如果我想添加其他类型的可拖动控件,这很难维护。

我想做的是将所有处理隔离到它自己的类(比如 DragLine)中,从 FrameworkElement 或 UIElement 派生。要将这个可拖动的 UI 元素添加到 Canvas 中,我将创建一个 DragLine 实例并将其添加到 Canvas.Children。我的程序的其余部分只会看到 DragLine 实例,无需担心用于绘制新元素的线条或椭圆。

我想使用标准形状(例如椭圆)来实现线端点,而不是自己绘制所有 UI 元素。那是因为我想重用事件处理并命中测试这些已经实现的形状。

问题:从 FrameworkElement 派生是解决此问题的正确方法吗?然后,直线和端点椭圆将只是我的新班级的视觉和逻辑子级。

如果不推荐从 FrameworkElement 派生,您将如何处理?

如果是的话,鉴于新类只能在 Canvas 上使用(并且不需要很好地用于 Grid 或 StackPanel 之类的东西),有没有办法简化其实现?

【问题讨论】:

从 FrameworkElement 派生是我的做法。这在 WPF 世界中意义不大。 实施 Measure/ArrangeOverrides 似乎有点多余,因为这个新类只能在 Canvas 上使用(它不会尝试对布局做任何智能操作)。有关简化这些的任何提示?我尝试不覆盖这些,结果是没有呈现任何视觉孩子。 【参考方案1】:

啊,是的,试图重新发明框架中已经存在的东西,因为你不知道它们。很长一段时间以来,它一直是我的爱好。

您在这里所做的是尝试创建一个特殊类型的adorner。使用框架中已经存在的位,这些操作相对容易。 I suggest you start here.

您可能想查看的另一件事是Decorators。做几乎相同的事情,但我认为它们更直观。使用哪一种取决于您的要求。

【讨论】:

我知道装饰器,但不确定如何根据我的目的调整它们。我不想在我的 GUI 中装饰另一个元素,我正在编写的元素 我想要拖动的东西,它没有附加到任何其他元素。不过,我会再看一遍,如果我意识到我错过了一些重要的事情,我不会感到惊讶。 看起来像 adorners + a <Line /> 正是你所需要的。 哦,现在我又考虑了一遍,您的解决方案听起来不错。我会放手的。 它是 - 这是我的应用程序的输出:flickr.com/photos/nurpax/3721686206 @Nurpax 嘿!看起来很棒。恭喜。有您项目的链接吗?

以上是关于WPF - 创建要在画布上使用的简单控件的主要内容,如果未能解决你的问题,请参考以下文章

WPF教程四;布局之Canvas面板

WPF:如何使用透明画布和可点击子项制作覆盖控件

如何在WPF控件上应用简单的褪色透明效果?

如何让用户在 WPF 中使用画布绘制线条

C# WPF 可拖动用户控件在 Canvas 上的 ListBox 中

WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本