您好我正在开发一个wpf应用程序,然后我需要在任务栏中放入一个通知球,如下图所示
我正在使用此关注代码
<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>
上找不到任何相关内容
问题是:有没有办法做到这一点? 如果是,我可以使用此代码或另一个库? 也许我把它称为通知球因为我从技术上不知道它的名字
答案 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创建一个新图标 结果非常棒,如下图所示