使用MVVM模式中的WPF Webbrowser填充Dockpanel

时间:2015-04-13 13:36:40

标签: c# wpf mvvm dockpanel

我想写一个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模式时遇到了实际问题。

感谢您的帮助!

1 个答案:

答案 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()