来自WinForm的WPF集成=> Application.Current.Windows错了

时间:2017-01-09 17:03:15

标签: .net wpf winforms

我使用

从Winform Project运行WPF项目
    Dim frm2 As New EspBtpWpf.MainWindow("TableauBord", gEnv)
    Integration.ElementHost.EnableModelessKeyboardInterop(frm2)
    frm2.Show()

在我的WPF项目中,我有一个主窗口(MainWindow)和一个用户控件(ucTableauBord)。 我的MainWindow将ucTableauBord初始化为他的一个Frame。

    public partial class MainWindow : Window {
        public MainWindow(string pMode, SqiD23.Env pEnv=null)  {
            Classes.clsGlobal.EnsureApplicationResources(); // Lier le dictionnary aux ressources si on ne passe pas par le point d'entrée de l'application.
            ...
            LoadInterface(pMode);
        }

        public  MainWindow() :this("TableauBord") {
        }

        private void LoadInterface(string pMode) {
            if (pMode=="TableauBord") {
                navigateMain(new ucTableauBord());
            } else
                navigateMain(new ucBudgetDetaille());
        }

        /// <summary>Charge le userControl P dans le corps de la page principale.</summary>
        /// <param name="p">Instance du UserControl (new MyUserControl()).</param>
        public void navigateMain(UserControl p) {
            if ((frmMain.Content == null) || (frmMain.Content.ToString() != p.ToString()))
                frmMain.Content = p; // */
        }
}

和UserControl:

    public partial class ucTableauBord : ucTemplate {
        public ucTableauBord() {
            InitializeComponent();
            Load();
        }

        private void Load() {
            ...
            foreach (Window window in Application.Current.Windows.OfType<MainWindow>()) { // Retourne 0 car il ne voit que ucTableauBord lors du premier appel
                WinMain = (MainWindow)window;
            }
            if (WinMain != null) SetMsgMain("OK Load.");
        }
}

我的问题是我需要从ucTableauBord访问MainWindow。 但是,在第一次加载时,Application.Current.Windows不包含MainWindows,而是包含Microsoft.XamlDiagnostics.WpfTap.WpfVisualTreeService.Adorners.AdornerLayerWindow元素。 如果我关闭WPF窗口(没有关闭WinForm项目,并且我再次加载WPF项目,Application.Current.Windows包含所需的MainWindow。 它很奇怪,但如果我直接运行我的WPF项目,Application.Current.Windows总是包含所需的MainWindow。

为什么首次运行WPF项目会破坏Application.Current.Windows?

此致

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你要在这里做什么,但如果你想获得UserControl的父窗口的引用,你可以在加载UserControl后调用Window.GetWindow方法:

public partial class ucTableauBord : ucTemplate
{
    public ucTableauBord()
    {
        InitializeComponent();
        this.Loaded += Load();
    }

    private void Load(object sender, RoutedEventArgs e)
    {
        MainWindow win = Window.GetWindow(this) as MainWindow;
        //...
    }
}

答案 1 :(得分:0)

您可以将MainForm引用传递给用户控件,以便以后保存。这通常在构造函数中完成,但在创建属性后立即设置属性通常也是可以接受的。

在主表格上:

navigateMain(new ucTableauBord(this));

在用户控件上:

public partial class ucTableauBord : ucTemplate {
    public ucTableauBord(MainForm mainForm) {
        InitializeComponent();
        _mainForm = mainForm;
        Load();
    }

    private void Load() {
        ...
        //foreach (Window window in Application.Current.Windows.OfType<MainWindow>()) { // Retourne 0 car il ne voit que ucTableauBord lors du premier appel
            WinMain = (MainWindow)window;
        //}
        //if (WinMain != null) SetMsgMain("OK Load.");
        _mainForm.DoSomething();
    }

    private MainForm _mainForm;
}

为了让Visual Studio设计师满意,您可能需要添加一个名为InitializeComponent的“默认”无参数构造函数。