WPF實現系統托盤


新博客地址:https://gyrojeff.top,歡迎訪問! 本文為博客自動同步文章,為了更好的閱讀體驗,建議您移步至我的博客👇

本文標題:WPF實現系統托盤

文章作者:gyro永不抽風

發布時間:2020年09月10日 - 13:09

最后更新:2020年09月15日 - 08:09

原始鏈接:http://hexo.gyrojeff.moe/2020/09/10/WPF%E5%AE%9E%E7%8E%B0%E7%B3%BB%E7%BB%9F%E6%89%98%E7%9B%98/

許可協議: 署名-非商業性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0) 轉載請保留原文鏈接及作者!

在WinForm當中,我們可以使用非常輕松地實現系統托盤,在.NET Core的WPF當中,System.Windows.Form並不能作為命名空間引用,本文將講述如何在WPF中實現系統托盤,以及如何將窗口最小化到系統托盤。

安裝NuGet包

搜索Hardcodet.NotifyIcon.Wpf並安裝:

編寫ViewModel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class NotifyIconViewModel
{
/// <summary>
/// 激活窗口
/// </summary>
public ICommand ShowWindowCommand
{
get
{
return new DelegateCommand
{
CommandAction = () =>
{
Application.Current.MainWindow.Activate();
}
};
}
}

/// <summary>
/// 隱藏窗口
/// </summary>
public ICommand HideWindowCommand
{
get
{
return new DelegateCommand
{
CommandAction = () => Application.Current.MainWindow.Hide()
};
}
}


/// <summary>
/// 關閉軟件
/// </summary>
public ICommand ExitApplicationCommand
{
get
{
return new DelegateCommand { CommandAction = () => Application.Current.Shutdown() };
}
}
}

其中,雖然代碼中用到了DelegateCommand類,但實際上並未實際發生作用,只是為了更好地封裝代碼,增加某些特定條件下的可讀性,讀者也可自行將其更改為普通的Command。下面為DelegateCommand類代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class DelegateCommand : ICommand
{
public Action CommandAction { get; set; }
public Func<bool> CanExecuteFunc { get; set; }

public void Execute(object parameter)
{
CommandAction();
}

public bool CanExecute(object parameter)
{
return CanExecuteFunc == null || CanExecuteFunc();
}

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}

在App.xaml中添加托盤信息並關聯ViewModel

在App.xaml添加命名空間:

1
xmlns:tb="http://www.hardcodet.net/taskbar"

如果策略並不是隱藏窗口而是直接關閉窗口,那么為了防止所有窗口都退出導致的程序關閉,我們需要添加額外的一行屬性:
1
ShutdownMode="OnExplicitShutdown"

而不是原來的 OnLastWindowClose。接下來,我們在 Application.Resource標簽內添加系統托盤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<Application.Resources>
<ContextMenu x:Shared="false" x:Key="SysTrayMenu">
<MenuItem Header="顯示窗口" Command="{Binding ShowWindowCommand}" />
<MenuItem Header="關閉窗口" Command="{Binding HideWindowCommand}" />
<Separator />
<MenuItem Header="退出" Command="{Binding ExitApplicationCommand}" />
</ContextMenu>
<tb:TaskbarIcon x:Key="Taskbar"
ToolTipText="UIToy by Haoyun Qin"
DoubleClickCommand="{Binding ShowWindowCommand}"
ContextMenu="{StaticResource SysTrayMenu}"
IconSource="UIToy.ico">
<tb:TaskbarIcon.DataContext>
<local:NotifyIconViewModel />
</tb:TaskbarIcon.DataContext>
</tb:TaskbarIcon>
</Application.Resources>

上面,我們針對不同的操作,綁定了相關的命令。還需要添加一個 ico文件(這里我添加的是 UIToy.ico

在啟動時顯示系統托盤

App.xaml.cs當中初始化Taskbar

1
2
3
4
5
6
7
8
9
10
11
public partial class App : Application
{
public static TaskbarIcon TaskbarIcon;

protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
TaskbarIcon = (TaskbarIcon)FindResource("Taskbar");

}
}

然后我們就可以發現,圖標已經在系統托盤當中顯示了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM