动态附加/分离WPF行为是解决我的问题的有效方法吗?

动态附加/分离WPF行为是解决我的问题的有效方法吗?,wpf,attachedbehaviors,Wpf,Attachedbehaviors,短版: 在运行时将WPF行为动态附加到控件或从控件中分离WPF行为在WPF中是可行的做法,还是我应该寻找不同的方法来解决我的问题 长版本: 我有一个WPF控件,它表示一个绘图表面。用户可以使用多种鼠标“工具”中的任意一种。一个工具画一条线,一个工具画一条多段线,一个工具只选择现有的项目,等等 我在鼠标事件的代码隐藏中处理这个问题。不幸的是,无论我如何尝试推广它,都会有很多工具类型的切换,因为这些工具做的事情非常不同。因此,它很难维护。添加新工具需要太多的编辑和测试。处理程序不断变大 我需要使这个

短版:

在运行时将WPF行为动态附加到控件或从控件中分离WPF行为在WPF中是可行的做法,还是我应该寻找不同的方法来解决我的问题

长版本: 我有一个WPF控件,它表示一个绘图表面。用户可以使用多种鼠标“工具”中的任意一种。一个工具画一条线,一个工具画一条多段线,一个工具只选择现有的项目,等等

我在鼠标事件的代码隐藏中处理这个问题。不幸的是,无论我如何尝试推广它,都会有很多工具类型的切换,因为这些工具做的事情非常不同。因此,它很难维护。添加新工具需要太多的编辑和测试。处理程序不断变大

我需要使这个控件相对容易,以便这个项目的下一个开发人员理解它,并添加一个新工具,而不用担心破坏任何东西

WPF行为似乎提供了一种自然的方式来简化这一点,并使其更加模块化;您在控件上设置了特定的“工具行为”,它只处理所需的鼠标事件,并根据需要更改控件属性。不同的工具代码不再混合在一起

但这种方法与我过去使用WPF行为的方式不同。这需要我能够在运行时通过按下按钮动态附加/分离行为。这对我来说是新鲜事。通常我只有一个简单的行为,我在XAML中对一个控件声明一次,并且在控件的生命周期中保持这种状态。事实上,我见过的所有WPF行为示例都是在XAML中设置一次行为,然后忘记它


我想知道有没有人做过这样的事?这是一种我应该追求的方法,还是可能最终证明它很难实现?还是我应该寻找一个不同的解决方案

我会考虑编写一个行为/附加属性,其值是一个枚举,或者可能是一个接口。当值更改时,根据需要删除和添加处理程序等。将该附着属性绑定到指定“模式”的viewmodel属性。接口的想法是,您可以编写一个接口,它提供了所有必要的细节,通过编写实现该接口的新的具体类,使其更易于扩展。谢谢,这听起来更合理。为了子孙后代,我将从这个问题开始(以防其他人有这个问题),Ed的方法被证明非常有效。它本质上是第二层次的行为。我的行为定义了当前工具。该工具是一个接口,“ITool”。当用户设置行为的附加属性(当前工具)时,行为类调用ITool的“OnAttach”方法,提供关联对象作为参数。然后,每个工具根据需要在OnAttach中连接到关联对象的事件处理程序。还有一个类似的“OnDetch”。