【发布时间】:2014-10-31 13:23:51
【问题描述】:
最近有人在 SO 和其他人建议我可以利用模型-视图-演示者模式来重构我在 WPF 和 Winforms(主要是 WPF)中构建的图表/流程图设计器。模型如下所示。
我不明白的是,这种模式如何与在运行时添加到设计器表面的控件一起工作。这对我提出的问题如下:
- 在运行时添加到设计器的控件/连接/覆盖/等是否具有它们的 拥有“演示者”,或者他们应该共享一个演示者(很可能是 DesignerPresenter)。
- 如果控件/连接/叠加/等有自己的演示者,它们是否嵌套在 DesignerPresenter 中?
- 将控件添加到设计器画布时,我触发了一个通知演示者的事件。设计师应该在这里参考画布吗?我不明白它是怎么做到的,因为我认为它负责将新组件添加到 Canvas Control Childen。
为此,我一直在玩一些“虚拟”演示者代码,我有以下内容:
public interface IDesignerView : IView
{
Guid Id { get; set; }
Canvas Canvas { get; set; }
event EventHandler<MouseEventArgs> MouseDown;
event EventHandler<MouseEventArgs> ControlDropped;
}
public interface IControlView : IView
{
Guid Id { get; set; }
event EventHandler<MouseEventArgs> MouseDown;
}
public class DesignerView : IDesignerView
{
public Guid Id { get; set; }
public Canvas Canvas { get; set; }
public event EventHandler<MouseEventArgs> MouseDown;
public event EventHandler<MouseEventArgs> ControlDropped;
}
public class DesignerPresenter :Presenter<IDesignerView>
{
public DesignerPresenter(IDesignerView view) : base(view)
{
}
public override void Initialize()
{
View.ControlDropped += View_ControlDropped;
View.MouseDown += View_MouseDown;
}
private void View_MouseDown(object sender, MouseEventArgs e)
{
//Might need to unselect selected controls
}
private void View_ControlDropped(object sender, MouseEventArgs e)
{
IControlView view = ControlBuilder.Build(...)
View.Canvas.Children.Add(view)
}
}
【问题讨论】:
-
出于好奇,为什么在使用 WPF 时使用 MVP 而不是 MVVM?
标签: c# wpf winforms architecture mvp