WPF - 任务栏通知球

时间:2018-03-26 17:09:22

标签: c# wpf xaml taskbar

您好我正在开发一个wpf应用程序,然后我需要在任务栏中放入一个通知球,如下图所示

enter image description here

我正在使用此关注代码

<tb:TaskbarIcon x:Name="IconeDeNotificacao" 
                IconSource="../Images/icon-one.ico"
                    ToolTipText="ArquivarNfe"
                    TrayLeftMouseUp="ShowWindow_Click">

        <!-- Set a simple context menu  -->
        <!-- the data context of the context menu is the NotifyIcon itself (see more about this in DataBinding samples) -->


<tb:TaskbarIcon.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Abrir Sistema"
                      Command="{commands:ShowSampleWindowCommand}"
                      CommandParameter="TelaPrincipal">
                <MenuItem.Icon>
                    <fa:ImageAwesome Icon="PlayCircle" Width="10"></fa:ImageAwesome>
                </MenuItem.Icon>
            </MenuItem>

            <Separator />

            <MenuItem Header="Esconder Sistema"
                      Command="{commands:HideSampleWindowCommand}"
                      CommandParameter="TelaPrincipal">
                <MenuItem.Icon>
                    <fa:ImageAwesome Icon="Pause" Width="10"></fa:ImageAwesome>
                </MenuItem.Icon>
            </MenuItem>

            <Separator />

            <MenuItem Header="Configurações"
                      Command="{commands:ConfiguracoesWindowCommand}"
                      CommandParameter="TelaPrincipal">
                <MenuItem.Icon>
                    <fa:ImageAwesome Icon="Cog" Width="10"></fa:ImageAwesome>
                </MenuItem.Icon>
            </MenuItem>
            <Separator />
          </ContextMenu>
        </tb:TaskbarIcon.ContextMenu>
    </tb:TaskbarIcon>

但是我在the documentation

上找不到任何相关内容

问题是:有没有办法做到这一点? 如果是,我可以使用此代码或另一个库? 也许我把它称为通知球因为我从技术上不知道它的名字

3 个答案:

答案 0 :(得分:2)

如果您不关心p / invoke,那么您可以使用windows forms notifyicon机制,如下所述: http://www.abhisheksur.com/2012/08/notifyicon-with-wpf-applications.html

你没有询问任何其他功能,但这个实现是特定于wpf的,并且做了各种各样的花哨的东西: https://www.codeproject.com/Articles/36468/WPF-NotifyIcon#show_hide

您还可以使用Windows 8+ sdk dll添加操作中心消息。如果要显示通知消息,这非常好。他们有可选的图片和各种格式。添加一个时,操作中心会显示一条通知。这可能会避免您更改应用程序图标的要求。

答案 1 :(得分:1)

可能还有其他方法可以做到。

但我知道可以选择使用WINAPI

在代码中执行此操作

在winAPI中有一个名为Shell_NotifyIcon的函数。 你必须导入shell32.dll

[DllImport("shell32.dll")]
 static extern bool Shell_NotifyIcon(uint dwMessage,
    [In] ref NOTIFYICONDATA pnid);

这是一个很好的链接。

https://www.pinvoke.net/default.aspx/shell32.shell_notifyicon

您可以通过在c#中搜索shell_notifyicon来轻松找到代码。

答案 2 :(得分:1)

在搜索了一段时间之后我真的意识到我不能使用预设属性这样做,所以我必须在我的xaml中绘制一个图标,然后将其渲染为Icon

在我的xaml中我用这个,我设置画布索引-1;使它隐藏

        <Canvas x:Name="CanvasIcon" HorizontalAlignment="Left" VerticalAlignment="Top" Width="32" Height="32" Panel.ZIndex="2">
            <Border x:Name="CanvasIconCount" Visibility="Hidden" CornerRadius="5" Width="18  " Height="19" Background="Red" Panel.ZIndex="1" Margin="5 0 0 10">
                <Label  Foreground="White" Padding="0" FontSize="14" FontWeight="Medium" HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center">9</Label>
            </Border>
            <Image Margin="-4 0 0 0" Source="../Images/icon-one.ico" Width="32" Height="32"></Image>
        </Canvas>

我使用的代码是后面的

        //gets the canvas content
        public static void SaveCanvas(Window window, Canvas canvas, int dpi)
        {

            var rtb = new RenderTargetBitmap(
                (int)canvas.Width, //width 
                (int)canvas.Height, //height 
                dpi, //dpi x 
                dpi, //dpi y 
                PixelFormats.Pbgra32 // pixelformat 
                );
            rtb.Render(canvas);
            SaveRTBAsPNG(rtb;
        }

        // convert the canvas to png and creat a transparent Icon
        private static void SaveRTBAsPNG(RenderTargetBitmap bmp)
        {
            PngBitmapEncoder enc = new PngBitmapEncoder();
            enc.Frames.Add(BitmapFrame.Create(bmp));
            MemoryStream iconStreamBlue = new MemoryStream();
            enc.Save(iconStreamBlue);
            Bitmap bmpa =(Bitmap)System.Drawing.Image.FromStream(iconStreamBlue);
            IntPtr Hicon = bmpa.GetHicon();
            Icon myIcon = System.Drawing.Icon.FromHandle(Hicon);
            //Set the icon to  the taskIconBar
            IconeDeNotificacao.Icon = myIcon; //set the new  icon
        }

通过这种方式,我可以使用NotificationBall创建一个新图标 结果非常棒,如下图所示

enter image description here