首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有Shell窗口标题的已注册类型链接容器

具有Shell窗口标题的已注册类型链接容器
EN

Stack Overflow用户
提问于 2019-01-07 18:35:29
回答 2查看 60关注 0票数 1

我有一个Prims应用程序,它使用Bootstrapper类启动应用程序和主窗口。引导程序被贬值了,所以我把它换成了PrismApplication。我添加了一个类,它封装了串行通信,并公开了当串行类状态改变时触发的事件(例如,连接、断开连接等)。为了实例化这个组件,我使用RegisterSingleton:

代码语言:javascript
复制
public partial class App : PrismApplication
{
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {            
        containerRegistry.RegisterSingleton<IMessages, MessageBuilder>();
        containerRegistry.RegisterSingleton<AbstractLibSerial, LibSerialVariant1>();
        containerRegistry.RegisterSingleton(typeof(SettingsModel));
    }

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

        moduleCatalog.AddModule(typeof(MainModule.MainModule));
        moduleCatalog.AddModule(typeof(SettingsModule.SettingsModule));            
    }

    protected override Window CreateShell()
    {
        return (Window)new Shell();    
    }
}

Shell.xaml:

代码语言:javascript
复制
<Window x:Class="VibeOR.Desktop.Shell"
    xmlns:prism="http://www.codeplex.com/prism"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:VibeOR.Desktop"
    mc:Ignorable="d"
    Title="Vibe Base Station" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">

    <ContentControl Name="MainRegion" prism:RegionManager.RegionName="MainRegion"/>  

当我运行应用程序时,我看到RegisterTypes在CreateShell之前被调用,所以我希望能够将实例化的LibSerialVariant1单例中的事件链接到CreateShell类的标题窗口。但是,您可以在上面的代码中看到,我正在手动实例化shell (new ())。我不确定如何访问已注册的容器类型,以便将它们与新实例化的shell对象链接起来?

任何投入都将是巨大的。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-07 19:13:22

为了实例化这个组件,我使用RegisterSingleton

这看起来像是一个误解-注册一个类型不会创建一个实例。

如果希望创建和注册单例,则可以注册实例(实例始终是单例):

代码语言:javascript
复制
_container.RegisterInstance<IInterface>( _container.Resolve<Implementation>() );

但是您必须小心这一点,因为无法保证Implementation的所有依赖项都已注册(它们可能来自其他模块)。

票数 1
EN

Stack Overflow用户

发布于 2019-01-08 17:18:33

谢谢@Haukinger!我现在在主应用程序中实例化LibSerial,并使用标准的windows事件将事件连接到Shell类中(因为Shell是基于Window类的)。

代码语言:javascript
复制
public partial class App : PrismApplication
{
    private AbstractLibSerial _lib;

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {            
        containerRegistry.RegisterSingleton<IMessageBuilder, MessageBuilderVariant1>();
        containerRegistry.RegisterSingleton<AbstractLibSerial, LibSerialVariant1>();
        containerRegistry.RegisterSingleton(typeof(SettingsModel));
        var _container = containerRegistry.GetContainer();
        _lib = _container.Resolve<LibSerialVariant1>();
        containerRegistry.RegisterInstance<AbstractLibSerial>(_lib);
    }
    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {
        base.ConfigureModuleCatalog(moduleCatalog);            


        moduleCatalog.AddModule(typeof(MainModule.MainModule));
        moduleCatalog.AddModule(typeof(SettingsModule.SettingsModule));            
    }

    protected override void InitializeShell(Window shell)
    {
        base.InitializeShell(shell);
        _lib.SerialEvent += ((Shell)shell).OnSerialEvent;
    }
    protected override Window CreateShell()
    {
        return (Window)new Shell();
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54079931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档