2

シンプルな WPF アプリケーション MyWPF.exe があります。

namespace MyWPF
{
     /// <summary>
     /// Interaction logic for MainWindow.xaml
     /// </summary>
   public partial class MainWindow : Window
   {           

    public MainWindow()
    {
        InitializeComponent();

    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
     MessageBox.Show("Button is clicked");
    }
  }
}

この「MainWindow」を Winform アプリケーションにロードしたいのですが、以下のように試してみました。インスタンスを作成すると、「System.InvalidOperationException: ウィンドウはツリーのルートである必要があります。ウィンドウを Visual の子として追加できません。」という例外が発生します。

        String path = @"D:\Test\MyForm\MyWPF\bin\Debug\MyWPF.exe";
        System.Reflection.Assembly myExeApp = System.Reflection.Assembly.LoadFile(path);
        System.Type MyWPFType = myExeApp.GetType("MyWPF.MainWindow");

        var MyWPFInstance = (System.Windows.Window)myExeApp.CreateInstance("MyWPF.MainWindow");

        ctrlHost = new ElementHost();
        ctrlHost.Dock = DockStyle.Fill;
        ElementHost.EnableModelessKeyboardInterop(MyWPFInstance );
        ctrlHost.Child = MyWPFInstance ;
        this.Controls.Add(ctrlHost);

それは可能ですか、それとも何か不足していますか? 例外全体は次のとおりです。

System.InvalidOperationException: Window must be the root of the tree. Cannot add Window as a child of Visual.
   at System.Windows.Window.OnAncestorChanged()
   at System.Windows.FrameworkElement.OnAncestorChangedInternal(TreeChangeInfo parentTreeState)
   at System.Windows.TreeWalkHelper.OnAncestorChanged(DependencyObject d, TreeChangeInfo info)
   at System.Windows.DescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode)
   at MS.Internal.PrePostDescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode)
   at System.Windows.TreeWalkHelper.InvalidateOnTreeChange(FrameworkElement fe, FrameworkContentElement fce, DependencyObject parent, Boolean isAddOperation)
   at System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent)
   at System.Windows.FrameworkElement.AddLogicalChild(Object child)
   at System.Windows.Controls.UIElementCollection.AddInternal(UIElement element)
   at System.Windows.Controls.UIElementCollection.Add(UIElement element)
   at System.Windows.Forms.Integration.ElementHost.set_Child(UIElement value)
   at MyForm.Form1.button1_Click(Object sender, EventArgs e) in D:\Test\MyForm\MyForm\Form1.cs:line 37
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
4

2 に答える 2