移动到XAML字典时,WPF-NotifyIcon无法正常工作

时间:2013-09-03 00:36:49

标签: c# wpf notifyicon

我正在使用WPF-NotifyIcon,并且正在关注this tutorial,当我将XAML代码放入MainWindow.xaml时它会起作用,但是一旦我转到“从资源创建NotifyIcon”字典“部分停止显示在托盘中。

我有一个Dictionary1.xaml,其中包含以下代码:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:tb="http://www.hardcodet.net/taskbar">

    <!-- Globally declared notify icon -->
    <tb:TaskbarIcon x:Key="MyNotifyIcon"
            IconSource="/Notifier;component/assets/icon_16x.ico"
            ToolTipText="Notifier" MenuActivation="RightClick" Visibility="Visible" />

</ResourceDictionary>

App.xaml,代码如下:

<Application x:Class="Notifier.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary Source="Dictionary1.xaml" />
    </Application.Resources>
</Application>

我只是从本教程的那一部分复制了App类代码。

我做错了什么?为什么图标不显示?在一个相关的说明中,我怎么能有一个没有MainWindow的程序,而只是从任务栏运行(这对于这个控件来说是理想的)。

修改

我从App.xaml中取出了StartupUri并将以下代码放在我的App.xaml.cs中:

    protected override void OnStartup(StartupEventArgs e) {
        base.OnStartup(e);
        tb = (TaskbarIcon)FindResource("MyNotifyIcon");
        tb.Visibility = Visibility.Visible;
        //new MyClassIWantToInstantiate();
    }

它完美无缺,但这样做有什么不妥吗?

2 个答案:

答案 0 :(得分:2)

如果您想正常使用资源,则应将ResourceDictionary添加到MergedDictionaries部分。

示例:

<Application x:Class="Notifier.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary1.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

答案 1 :(得分:0)

在我按照https://www.codeproject.com/Articles/36468/WPF-NotifyIcon-2#hello上的教程进行学习时遇到了同样的情况

文本表明您应该在Initapplication()内实例化taskbarIcon,而这对我不起作用。

来自教程:

private void InitApplication()
{
  //initialize NotifyIcon
  tb = (TaskbarIcon) FindResource("MyNotifyIcon");
}

但是,当查看包含的示例时,它是在OnStartup覆盖中完成的,这对我来说似乎更有意义。

以下按预期工作。

private TaskbarIcon tb;

protected override void OnStartup(StartupEventArgs e)
{
  base.OnStartup(e);
  //create the notifyicon (it's a resource declared in NotifyIconResources.xaml
  tb = (TaskbarIcon)FindResource("MyNotifyIcon");
}