我正在开发一个使用MVVM的WPF应用程序。在这个应用程序中,我需要一个OpenGL控件(我正在使用OpenTK)。目前唯一有用的将OpenGL嵌入到WPF中的方法是使用WindowsFormsHost。到此为止,没有问题。
为了向我的场景添加内容,我需要在视图中访问OpenGL控件。当然,我想在ViewModel中添加和编辑内容。那么,如何在不违反MVVM模式的情况下访问OpenGL控件呢?
我正在使用一个场景对象,可以在视图中初始化,然后需要以某种方式传输到ViewModel中。我尝试使用WindowsFormsHost的Tag属性来实现,但没有成功(请参见下文)。ViewModel中的属性没有被更新。
有什么想法吗?
XAML
为了向我的场景添加内容,我需要在视图中访问OpenGL控件。当然,我想在ViewModel中添加和编辑内容。那么,如何在不违反MVVM模式的情况下访问OpenGL控件呢?
我正在使用一个场景对象,可以在视图中初始化,然后需要以某种方式传输到ViewModel中。我尝试使用WindowsFormsHost的Tag属性来实现,但没有成功(请参见下文)。ViewModel中的属性没有被更新。
有什么想法吗?
XAML
<UserControl x:Class="FancyOpenGlControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<WindowsFormsHost x:Name="WindowsFormsHost" Tag="{Binding Scene, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</UserControl>
C#
public FancyOpenGlControl()
{
this.InitializeComponent();
this.glControl = new OpenGLControl();
this.glControl.Dock = DockStyle.Fill;
this.WindowsFormsHost.Child = this.glControl;
this.glControl.HandleCreated += this.GlControlOnHandleCreated;
}
private void GlControlOnHandleCreated(object sender, EventArgs eventArgs)
{
this.WindowsFormsHost.Tag = new Scene(this.glControl);
// Doesn't work.
//BindingExpression bindingExpression = this.WindowsFormsHost.GetBindingExpression(TagProperty);
//if (bindingExpression != null)
//{
// bindingExpression.UpdateSource();
//}
}