我想写一个HTML编辑器。为此,我希望有一个MenuItem" New",它在单击Dockpanel时打开一个WPF WebBrowser控件。从现在开始,我使用CodeBehind实现了这个功能。所以我的XML代码看起来像这样:
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="661.94" Width="781.716">
<DockPanel x:Name="DockPanel1" HorizontalAlignment="Left" Height="629"
LastChildFill="False" VerticalAlignment="Top" Width="772">
<Menu DockPanel.Dock="Top" HorizontalAlignment="Right" Width="772">
<MenuItem Header="_Webseite">
<MenuItem Header="_Neu" Click="Neu_Click" />
<MenuItem Header="_Öffnen" Click="Oeffnen_Click"/>
<MenuItem Header="_Speichern" Click="Speichern_Click"/>
<Separator HorizontalAlignment="Left" Width="145"/>
<MenuItem Header="_Schließen" HorizontalAlignment="Left" Width="145"/>
</MenuItem>
<MenuItem Header="_Tools">
<MenuItem Header="_Button" Click="Select_Button"> </MenuItem>
</MenuItem>
</Menu>
<StackPanel></StackPanel>
</DockPanel>
在后面的代码中,实现了以下功能:
public partial class MainWindow : Window
{
public static IHTMLDocument2 doc;
public volatile WebBrowser webBrowser;
public MainWindow()
{
InitializeComponent();
}
private void Neu_Click(object sender, RoutedEventArgs e)
{
// create new WebBrowser for editing
webBrowser = new WebBrowser();
DockPanel.SetDock(webBrowser, Dock.Top);
this.DockPanel1.Children.Add(webBrowser);
string text = "<html><body></body></html>";
File.WriteAllText(@"C:\tmp\file.html", text);
webBrowser.Navigate("file:///C:/tmp/file.html");
doc = webBrowser.Document as IHTMLDocument2;
doc.designMode = "On";
}
但是现在我想通过使用MVVM模式来分离View和Model。任何人都可以帮我怎么做?使用我的应用程序来理解MVVM模式时遇到了实际问题。
感谢您的帮助!
答案 0 :(得分:1)
我使用Command绑定和MVVM Light信使类处理控件上的方法。为了使其工作,您需要为WPF安装MVVM Light Nuget包。使用此方法,MenuItem上的Click事件将绑定到ViewModel中的RelayCommand。 RelayCommand广播消息(&#34; MakeWebBrowser&#34;),订阅消息服务的任何类都可以访问该消息。 View codebehind订阅消息传递,接收消息并触发创建WebBrowser的方法。
查看:强>
<MenuItem Header="_Neu" Command="{Binding MakeWebBrowserCommand}" />
<强>视图模型:强>
声明RelayCommand:
RelayCommand MakeWebBrowserCommand
{
get;
private set;
}
在ViewModel构造函数中:
DoSomethingCommand = new RelayCommand(MakeWebBrowserCommandExecute);
定义MakeWebBrowserCommandExecutemethod:
private void MakeWebBrowserCommandExecute()
{
Messenger.Default.Send(new NotificationMessage("MakeWebBrowser"));
}
查看代码隐藏:
在View的构造函数中,注册NotificationMessages:
Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived);
定义NotificationMessageReceived方法:
private void NotificationMessageReceived(NotificationMessage msg)
{
if (msg.Notification == "MakeWebBrowser")
MakeWebBrowser();
}
重命名/定义方法:
private void Neu_Click(object sender, RoutedEventArgs e)
为:
private void MakeWebBrowser()