2011-12-22 89 views
2

我有一个需要Winform事件工作的复杂系统。不过,我想添加WPF元素。所以我需要将所有WPF事件映射到它们的winform对象。例如。我有这个方法来转换我派生的ElementHost类中的MouseMove事件。将WPF事件映射到Windows窗体事件

private void Child_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
     Point point = e.GetPosition(null); 
     System.Windows.Forms.MouseEventArgs eventArgs = 
      new System.Windows.Forms.MouseEventArgs 
       (System.Windows.Forms.MouseButtons.Left, 0, (int)point.X, (int)point.Y, 0); 
     OnMouseMove(eventArgs); 
    } 

注System.Windows.Input.MouseEventArgs(WPF)和System.Windows.Forms.MouseEventArgs(的Winforms)之间的差。

问题是有太多的事件需要用这种方式进行映射。如果不为每个事件编写我自己的映射方法,是否有可能实现这一点?

+1

你想实现什么? – Tigran 2011-12-22 15:01:54

+1

你为什么需要将它们全部映射出来? – Adam 2011-12-22 15:07:54

+0

ElementHost实现了OnMouseMove,你需要什么不在那里实现? – MBirchmeier 2011-12-22 15:09:59

回答

1

不,没有办法自动做到这一点,因为WPF和表单有不同的参数和事件,并在不同的环境下触发它们。你试图娶两件不同的东西,我怀疑是在噩梦之路上。

你想达到什么目的?我假设某种GUI抽象?您的抽象可能会更好地向下移动代码,并让GUI以他们想要的方式运行。

编辑:好的,我从编辑中看到,您正在通过WPF控件实现一个外观,以允许它们在您的表单环境中运行。看不到任何其他手动方式。你真的必须使用WPF控件吗?

+0

谢谢你的回答。是的,它必须是WPF控件。 – RolandK 2011-12-22 15:18:46

+1

可能在这里有一些信息:http://msdn.microsoft.com/en-us/library/ms751797.aspx – Adam 2011-12-22 15:19:10

1

不幸的是,我同意Gaz有没有简单的方法来自动做到这一点。

我推荐让过渡更简单的唯一方法是创建一些常见的扩展方法来完成所有事情,比如ToWinformsEvent。这样做的好处是很多控件都会使用相同的子参数,并且通过实现标准的扩展方法,您可以在某种程度上无意识地转换很多参数(例如,将点转换为MouseEventArgs可能会用于许多你的功能)

+0

感谢您的想法。 – RolandK 2011-12-28 13:38:23

1

同意其他海报,这只能手动完成。但是可以整齐地包装代码,以便只实现一次。

为了在最近的项目中处理这个问题,我创建了一个名为MouseManager的助手类。该MouseManager然后有这样的方法:

void Subscribe(IPublisWpfEvents publisher, ISinkMouseEvents target); 
void Subscribe(IPublishWinformsEvents publisher, ISinkMouseEvents target) 
void Unsubscribe(IPublisWpfEvents publisher); 
void Unsubscribe(IPublishWinformsEvents publisher); 

对于WPF用户控件我将实现IPublishWpfEvents,和WinForms用户控件我将实现IPublisWinFormsEvents。这两个接口对于内置的鼠标事件具有确切的签名,所以实际上不需要实现,只需在用户控件上粘贴接口即可。

最后,MouseManager将发布者(两种不同类型)之间的事件连接到订户(单一类型)。我必须创建自己的统一MouseArgs,它具有我自己定义的枚举,如MouseButton和MousePoint类。

这是一个很好的副产品,我现在有接口来处理我所有的鼠标事件,这意味着我可以使用RhinoMocks或类似方法对事件进行单元测试发布和下沉。

希望这有助于,

+0

感谢您的评论。也许我会放弃它。 – RolandK 2011-12-28 13:42:52