簡體   English   中英

如何從WPF用戶控件獲取托管WinForm的實例?

[英]How to get an instance of hosting WinForm from a WPF user control?

我有一個WPF UserControl ,它可以托管在WPF窗口或Windows Forms Form 當用戶按下“ X”按鈕以關閉托管窗口/窗體時,我想獲取此關閉事件並執行一些操作。

為此,我已訂閱UserControl的加載事件以獲取托管Windows /窗體實例並訂閱其關閉事件。

使用WPF窗口可以正常工作,但是當我嘗試使用Form進行相同操作時,出現錯誤,無法繼續。

WPFUsercontrol.xaml.cs

private void WpfUsercontrol_OnLoaded(object sender, RoutedEventArgs e)
{
    Window window = Window.GetWindow(this);
    if (window != null)
        window.Closing += window_closing;

    Form form = this.Parent as Form;    
    //Error: Cannot convert from System.Windows.DependencyObject to System.Windows.Forms.Form    
}

如何獲得與使用WPF窗口相同的關閉Form功能?

您不能僅將WPF UserControl的父對象強制轉換為System.Windows.Forms.Form即使該控件托管在Windows Forms Form ,因為托管並不是那么簡單,並且需要額外的“黑魔法”。

相反,您必須首先獲取HwndSource並獲取其ElementHost實例。 有了它,您可以訪問TopLevelControl ,這將是您要查找的Form

var hwndSource = (HwndSource)PresentationSource.FromDependencyObject(this);
var host = (ElementHost)Control.FromChildHandle(hwndSource.Handle);
Form form = (Form)host.TopLevelControl;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM