WPF xaml로 트레이 아이콘 메뉴에 붙일 context menu를 생성하게되면 xaml(Windows.Controls.ContextMenu)와 NotifyIcon(Windows.Forms.ContextMenu)가 일치하지 않아 문제가 발생하게된다.
따라서 변환을 하거나 WPF용으로 트레이 기능이 포함된 라이브러리를 사용해야되고 WPF용으로 찾아서 사용하게되었다. 또한 디자인으로 MaterialDesign in xaml을 사용하였다.
WPF용 NotifyIcon: www.hardcodet.net/wpf-notifyicon
구현
구현 소스: github.com/dogzz9445/CSharpTestExamples/tree/main/TrayWithMaterialDesignApp
// MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;
namespace TrayWithMaterialDesignApp
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += (o, r) =>
{
// 아이콘 초기화
TrayTaskbarIcon.Icon = new System.Drawing.Icon(@"Graphicloads.ico");
// 아이콘 더블클릭시 / 윈도우 활성화
TrayTaskbarIcon.TrayMouseDoubleClick += (s, e) => this.Show();
// 응용프로그램 종료시 / 아이콘 제거
System.Windows.Application.Current.Exit += (s, e) => TrayTaskbarIcon.Dispose();
// 설정 메뉴 클릭시 / 윈도우 활성화
SettingsMenuItem.Click += (s, e) => this.Show();
// 종료 메뉴 클릭시 / 응용프로그램 종료
CloseMenuItem.Click += (s, e) => System.Windows.Application.Current.Shutdown();
// 트레이 버튼 클릭시 / 윈도우 비활성화
ButtonTray.Click += (s, e) => this.Hide();
};
}
}
}
// MainWindow.xaml
<Window x:Class="TrayWithMaterialDesignApp.MainWindow"
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"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
TextOptions.TextFormattingMode="Ideal"
TextOptions.TextRenderingMode="Auto"
Background="{DynamicResource MaterialDesignPaper}"
FontFamily="{DynamicResource MaterialDesignFont}"
Height="100" Width="250">
<Grid>
<tb:TaskbarIcon
x:Name="TrayTaskbarIcon"
Visibility="Visible"
ToolTip="Tray Example"
MenuActivation="LeftOrRightClick">
<tb:TaskbarIcon.ContextMenu>
<ContextMenu>
<MenuItem x:Name="InformationMenuItem" Header="정보">
<MenuItem.Icon>
<materialDesign:PackIcon Kind="InformationOutline" />
</MenuItem.Icon>
</MenuItem>
<MenuItem x:Name="SettingsMenuItem" Header="설정">
<MenuItem.Icon>
<materialDesign:PackIcon Kind="Cog" />
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem x:Name="CloseMenuItem" Header="종료">
<MenuItem.Icon>
<materialDesign:PackIcon Kind="CloseThick" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</tb:TaskbarIcon.ContextMenu>
</tb:TaskbarIcon>
<Button
x:Name="ButtonTray"
Content="트레이"
Width="75" />
</Grid>
</Window>
'C#' 카테고리의 다른 글
Sliding Stream (0) | 2022.05.01 |
---|---|
Newtonsoft Nullable Json Property Read and Write (0) | 2022.04.01 |
[WPF] 소스로 트레이 아이콘 - 1 (Windows.Forms) (0) | 2021.02.04 |
[C#] 백그라운드에서 키보드 입력 감지 이벤트 1 (HotKey Hooking) (0) | 2021.01.29 |
Nuget 패키지 오프라인으로 설치 (System.Windows.Form) (0) | 2021.01.27 |