All Articles

C#

[WPF] 소스로 트레이 아이콘 - 2 (Forms 대신 Windows.Controls로)

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>