gpt4 book ai didi

c# - 使用 MVVM 将窗口句柄传递给 WPF 中的 View 模型

转载 作者:行者123 更新时间:2023-11-30 20:31:32 24 4
gpt4 key购买 nike

我正在使用需要窗口句柄的外部库。我的应用程序架构是 MVVM,但外部库并不完全适合这种架构。我已经决定 View 模型是调用需要窗口句柄的初始化函数的最合适的地方。如何获取从我的 View 到我的 View 模型的窗口句柄?

最佳答案

通常,您的 View 模型不应该知道 View 的实现细节(例如它的 HWND)。但是,正如您的问题所表明的,您使用的外部库需要您对其进行初始化,并且您只能在一个地方进行初始化。假设您的 View 模型是它最合适的位置(它甚至可能属于模型),您可以执行如下操作。

一旦所有部分都可用,此实现就会为您的 View 模型提供窗口句柄。请注意,您在 your previous question 中提供的 View 模型实现在 View 模型的构造函数中需要 HWND。您将不得不更改 View 模型,以便通过显式调用的方法或属性进行初始化。在下面的代码中,我假设您的 View 模型中有一个名为 OnWindowHandleAvailable 的方法。您当然可以调用该方法 Initialize,或者您可以在您显式设置的 View 模型上放置一个 Handle 属性。

public partial class View
{
public View()
{
InitializeComponent();
this.Loaded += View_Loaded;
this.DataContextChanged += View_DataContextChanged;
}

private void View_Loaded(object sender, RoutedEventArgs e)
{
GiveWindowHandleToViewModel();
}

private void View_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
GiveWindowHandleToViewModel();
}

private void GiveWindowHandleToViewModel()
{
// get view model
var viewModel = this.DataContext as ViewModel;
if (viewModel == null)
return;

// get window handle
var windowHandle = this.GetWindowHandle();
if (windowHandle == IntPtr.Zero)
return;

// signal view model
viewModel.OnWindowHandleAvailable(windowHandle);
}

private IntPtr GetWindowHandle()
{
// get window
var window = Window.GetWindow(this);
if (window == null)
return IntPtr.Zero;

// get window handle
return new WindowInteropHelper(window).Handle;
}
}

关于c# - 使用 MVVM 将窗口句柄传递给 WPF 中的 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43099803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com