Wpf 如何在ElementHost中使用Prism

Wpf 如何在ElementHost中使用Prism,wpf,prism,cal,cag,Wpf,Prism,Cal,Cag,我是Prism的新手,正在尝试在ElementHost中托管Prism控件。我似乎遗漏了一些非常基本的东西。我有一个包含ElementHost的WinForm。以下代码的格式为: public partial class Form1 : Form { public Form1() { InitializeComponent(); Bootstrapper bootstrapper = new Bootstrapper(); boo

我是Prism的新手,正在尝试在ElementHost中托管Prism控件。我似乎遗漏了一些非常基本的东西。我有一个包含ElementHost的WinForm。以下代码的格式为:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        Bootstrapper bootstrapper = new Bootstrapper();
        bootstrapper.Run();

        var child = bootstrapper.Container.Resolve<Shell>();
        elementHost.Child = child;

    }

我一直在深入研究Prism代码,试图找出为什么视图从未设置到区域中。我缺少一些基本的东西吗?

原因是Prism中的代码:

private static bool RegionManager::IsInDesignMode(DependencyObject element)
{
    // Due to a known issue in Cider, GetIsInDesignMode attached property value is not enough to know if it's in design mode.
    return DesignerProperties.GetIsInDesignMode(element) || Application.Current == null
        || Application.Current.GetType() == typeof(Application);
}
原因是对于非WPF应用程序,application.Current为NULL

解决方案:

创建将从System.Windows.Application继承的空类。名字不重要: 在插件的入口点执行以下代码:

public class MyApp : System.Windows.Application
{
}

if (System.Windows.Application.Current == null)
{
    // create the Application object
    new MyApp();
}

就是这样–现在您有了一个应用程序。Current不为null且不等于typeofApplication。

原因是Prism中的代码:

private static bool RegionManager::IsInDesignMode(DependencyObject element)
{
    // Due to a known issue in Cider, GetIsInDesignMode attached property value is not enough to know if it's in design mode.
    return DesignerProperties.GetIsInDesignMode(element) || Application.Current == null
        || Application.Current.GetType() == typeof(Application);
}
原因是对于非WPF应用程序,application.Current为NULL

解决方案:

创建将从System.Windows.Application继承的空类。名字不重要: 在插件的入口点执行以下代码:

public class MyApp : System.Windows.Application
{
}

if (System.Windows.Application.Current == null)
{
    // create the Application object
    new MyApp();
}

就是这样–现在您有了一个应用程序。Current不为null,并且它不等于应用程序的类型。

@Mark Lindell在上面为我工作。我唯一需要改变的就是下面的内容

我的引导者

 public  class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            return this.Container.Resolve<Shell>();
        }

        protected override void InitializeShell()
        {
            base.InitializeShell();    
            if (System.Windows.Application.Current == null)
            {
                // create the Application object
                new HelloWorld.Myapp();
            }

            //App.Current.MainWindow = (Window)this.Shell;
            //App.Current.MainWindow.Show();
            //MainWindow = (Window)this.Shell;

        }     

        protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();

            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
            moduleCatalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
        }
编辑:注意表单的加载方法处理程序必须由 右键单击窗体,在属性窗口中,转到事件并双击 clicl负载。复制和粘贴加载事件处理程序不起作用


@上面的马克·林德尔为我工作。我唯一需要改变的就是下面的内容

我的引导者

 public  class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            return this.Container.Resolve<Shell>();
        }

        protected override void InitializeShell()
        {
            base.InitializeShell();    
            if (System.Windows.Application.Current == null)
            {
                // create the Application object
                new HelloWorld.Myapp();
            }

            //App.Current.MainWindow = (Window)this.Shell;
            //App.Current.MainWindow.Show();
            //MainWindow = (Window)this.Shell;

        }     

        protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();

            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
            moduleCatalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
        }
编辑:注意表单的加载方法处理程序必须由 右键单击窗体,在属性窗口中,转到事件并双击 clicl负载。复制和粘贴加载事件处理程序不起作用

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Create the ElementHost control for hosting the WPF UserControl
            ElementHost host = new ElementHost();
            host.Dock = DockStyle.Fill;

            Bootstrapper bootstrapper = new Bootstrapper();
            bootstrapper.Run(true);

            //var uc = bootstrapper.Container.Resolve<Shell>(); This line threw error

            //Create the WPF UserControl.          

                            HelloWorld.Shell uc = new HelloWorld.Shell();

            //Assign the WPF UserControl to the ElementHost control's Child property.
            host.Child = uc;

            //Add the ElementHost control to the form's collection of child controls.
            this.Controls.Add(host);
        }
    }   


        }
public class MyApp : System.Windows.Application
{
}