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

3

我正在开发一个用于图像后处理的简单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世界中,这并不意味着太多。 - Muad'Dib
实现Measure/ArrangeOverrides似乎有点多余,因为这个新类只会在Canvas上使用(它不会尝试使用任何智能布局)。有简化这些的提示吗?我尝试不覆盖它们,结果是没有任何可视子元素被渲染。 - Nurpax
1个回答

4
啊,是的,试图重新发明已经存在于框架中的东西,因为你不知道它们。这已经成为我的爱好有一段时间了。
你在这里做的是尝试创建一种特殊类型的装饰器。使用框架中已经存在的部分相对容易实现。我建议你从这里开始。 另一件你可能想看看的事情是修饰符。它们基本上做同样的事情,但我认为它们更具可视化效果。使用哪一个取决于你的要求。

我知道装饰器,但不确定如何将它们适应于我的目的。我不想装饰GUI中的另一个元素,我正在编写的元素就是我想要拖动的东西,并且它没有附加到任何其他元素。不过我会再次研究一下,我不会感到惊讶地意识到我错过了重要的东西。 - Nurpax
似乎装饰器和<Line />正是你所需要的。 - user1228
哦,现在我再想一想,你的解决方案听起来不错。我会试一下的。 - Nurpax
这是我的应用程序的输出:http://www.flickr.com/photos/nurpax/3721686206/ - Nurpax
@Nurpax 嘿!看起来很棒。恭喜你。你的项目有链接吗? - user1228
抱歉,我从未开源或发布它。应该把它卖给Instagram :) - Nurpax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接