代码之家  ›  专栏  ›  技术社区  ›  Mark Lindell

如何在元素宿主中使用prisim

  •  1
  • Mark Lindell  · 技术社区  · 15 年前

    我是Prism的新手,我正试图在元素宿主中宿主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;
    
        }
    

    引导程序处理注册

    public class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            Container.RegisterType<MyView>();
            var shell = Container.Resolve<Shell>();
            return shell;
        }
    
        protected override IModuleCatalog GetModuleCatalog()
        {
            ModuleCatalog catalog = new ModuleCatalog();
            catalog.AddModule(typeof(MyModule));
            return catalog;
        }
    }
    

    此时myview.xaml只是一个标签。

    shell.xaml是包含以下xaml的用户控件:

    <ItemsControl Name="MainRegion" cal:RegionManager.RegionName="MainRegion" />
    

    模块代码最少:

    public class MyModule : IModule
    {
        private readonly IRegionViewRegistry _regionViewRegistry;
    
        public MyModule(IRegionViewRegistry registry)
        {
            _regionViewRegistry = registry;   
        }
    
        public void Initialize()
        {
            _regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(MyView));
        }
    }
    

    我一直在深入追踪Prism代码,试图找出为什么视图从未设置到该区域。我错过了一些基本的东西吗?

    2 回复  |  直到 10 年前
        1
  •  4
  •   Mark Lindell    13 年前

    原因是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应用程序,应用程序。当前为空!

    解决方案:

    1. 创建将从System.Windows.Application继承的空类。(名字不重要):

    在插入插件时,执行以下代码:

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

    现在您有了一个应用程序。current不为空,它不等于typeof(application)。

        2
  •  0
  •   user2330678    10 年前

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

    我的引导程序

     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));
            }
    

    还有我的形体课

    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);
            }
        }   
    
    
            }
    

    为了清楚起见,我在包含shell的WPF Prism应用程序中添加了下面的类。

    public class MyApp : System.Windows.Application
    {
    }
    

    编辑:请注意,加载方法处理程序(表单的)必须由 右键单击窗体,在属性窗口中,转到事件并双击 CLICL负载。复制和粘贴加载事件处理程序不起作用。

    推荐文章