在WPF中编写一个VTK应用程序,试图遵循MVVM

本文关键字:应用程序 VTK MVVM 一个 WPF | 更新日期: 2023-09-27 18:09:55

所以我对WPF和MVVM很陌生,虽然我理解这个前提,但很多这些东西对我来说就像试图阅读象形文字一样。

基本上,我的情况是这样的:我正在使用Activiz, VTK的c#包装器,这是一个图像处理/可视化库。在这个库中,有一个叫做vtk:RenderWindowControl的WinForms控件,它是一个opengl控件,包含处理所有可视化功能的类。我认为使用WinForms会更容易,但这对我来说不是一个真正的选择。

所以,在WPF应用程序中使用vtk:RenderWindowControl,我只需要把它推到WindowsFormsHost,然后我可以使用它或多或少就像示例代码一样,在后面的代码(如果这是正确的术语。xaml.cs文件)

这对于测试应用程序来说很好,但在实践中,如果可能的话,我想遵循MVVM。这就是我遇到瓶颈的地方。如果"renderControl"生活在视图类,我怎么能引用它,并从ViewModel使用它?我认为绑定是这个问题的答案,但是我只知道如何对简单的类型和命令进行绑定。

根据我在另一个线程中发现的想法,我设法设置了类似于这个答案的东西

我的后台代码是这样的:

public partial class RenderPanel_View : UserControl
{
    public static readonly new DependencyProperty RWControlProperty =
        DependencyProperty.Register("RWControl", typeof(RenderWindowControl), typeof(RenderPanel_View), new PropertyMetadata(null));
    public RenderWindowControl RWControl
    {
        get { return (RenderWindowControl)GetValue(RWControlProperty); }
        set { SetValue(RWControlProperty, value); }
    }
    public RenderPanel_View()
    {
        // This is necessary to stop the rendercontrolwindow from trying to load in the 
        // designer, and crashing the Visual Studio. 
        if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) {
            this.Height = 300;
            this.Width = 300;
            return;
        }
        InitializeComponent();
        this.RWControl = new RenderWindowControl();
        this.RWControl.Dock = System.Windows.Forms.DockStyle.Fill;
        this.WFHost.Child = this.RWControl;
    }
}

我的。xaml看起来像这样

<UserControl x:Class="vtkMVVMTest.RenderPanel.RenderPanel_View"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:vtk="clr-namespace:Kitware.VTK;assembly=Kitware.VTK"
         xmlns:rp="clr-namespace:vtkMVVMTest.RenderPanel"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         RWControl="{Binding VMControlProperty}">
    <Grid>
        <WindowsFormsHost x:Name ="WFHost"/>
    </Grid>
</UserControl>

所以两件事。第一,xaml头的最后一行是一个错误,"成员'RWControl'无法识别或访问"。我真的不明白为什么。其次,我猜是方程的ViewModel一半,VMControlProperty应该如何定义?

至少我是在正确的轨道上,还是这是大错特错?

在WPF中编写一个VTK应用程序,试图遵循MVVM

一些控件不是MVVM友好的,你必须使ViewModel意识到视图接口,并允许与它直接交互。不要把整个控件打开给ViewModel,这会破坏编写测试的能力,在上面放一个接口,比如IRenderPanelView,在接口中只打开你需要从ViewModel访问的功能。然后,您可以在视图中创建这种类型的DP属性,在构造函数中设置它并将其绑定到ViewModel。