微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从资源加载任务栏图标并使用 Prism 注入视图模型

如何解决从资源加载任务栏图标并使用 Prism 注入视图模型

背景

我正在尝试编写一个主要位于系统托盘上的应用程序,它将来会有一个窗口,因此右键单击该图标会打开该窗口。

代码

我目前没有在 Prism 启动时定义 shell,即:

protected override Window CreateShell()
{
    return null;
}

通知图标(使用 Hardcodet.NotifyIcon 如果这有什么不同?)在资源字典中定义,因为我没有启动 View xaml 将图标添加到:

<!-- the application's NotifyIcon - started from App.xaml.cs. Declares its own view model. -->
    <tb:TaskbarIcon x:Key="NotifyIcon"
                    IconSource="{Binding UserStatus,Converter={StaticResource UserStatusToImageSourceConverter}}"
                    ToolTipText="Double-click for window,right-click for menu"
                    DoubleClickCommand="{Binding ShowWindowCommand}"
                    ContextMenu="{StaticResource SysTrayMenu}">

         <!--self-assign a data context (Could also be done programmatically)--> 
        <tb:TaskbarIcon.DataContext>
            <viewmodels:NotifyIconviewmodel />
        </tb:TaskbarIcon.DataContext>
    </tb:TaskbarIcon>

视图模型,正如您在该代码段的后面部分看到的,采用 NotifyIconviewmodel,它有一个构造函数参数,因此我可以使用 IEventAggregator 在视图的不同部分之间进行通信(就像您直接单击托盘图标时显示的上下文菜单中的视图一样)。

视图模型的签名如下所示:

public NotifyIconviewmodel(IEventAggregator eventAggregator)
{
    _eventAggregator = eventAggregator;
    ...
}

服务已注册

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    ...
    containerRegistry.Register<NotifyIconviewmodel>();
}

并且通知图标本身在 OnInitialized 方法中实例化:

protected override void OnInitialized()
{
    base.OnInitialized();
    notifyIcon = (TaskbarIcon)FindResource("NotifyIcon");
}

问题

然而,在启动时抛出的异常是找不到视图模型的认构造函数(正确,没有)。但我的理解是,棱镜架构应该能够在需要时注入视图模型(及其 deps)?

XamlParseException

我只能假设我错误地初始化了通知图标并且 FindResource 不会导致棱镜库构造函数注入/DI 部分被触发,但是执行此行为的正确方法是什么?

解决方法

如果您使用容器来构造(也就是解析)对象,则会注入依赖项。

当普通的 Prism 应用程序解析 shell 时会发生这种情况,它(通过使用 ViewModelLocator)解析 shell 的视图模型,该视图模型解析 shell 视图模型的所有依赖项以及这些依赖项的依赖项等等。

如果您使用容器(即通过直接在 xaml 中构造对象),它将不会为您解析任何依赖项。

您可以创建图标并使用容器来解析 NotifyIconViewModel 并将其设置为 DataContext

protected override void OnInitialized()
{
    base.OnInitialized();
    notifyIcon = (TaskbarIcon)FindResource("NotifyIcon");
    notifyIcon.DataContext = Container.Resolve<NotifyIconViewModel>();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?