我正在使用带有MVVM模式和Caliburn Micro的WPF用C#编写程序。我不希望我的应用程序具有任务栏图标,我希望它只存在于系统托盘中。我通过使用NotifyIcon实现了这一点,但是问题是我无法使通知图标在单击时像任务栏图标一样起作用。
如果您查看任务栏图标,请单击行为:
我试图通过多种方式实现这一目标,但没有一个成功。
我现在拥有的是一个附加到ShowHide方法上的click事件,自定义属性ChangeActivated允许我激活正在显示的窗口,而不是当用户在窗口外单击时触发了Deactivated事件。
窗口:
<Window cal:Message.Attach="[Event Deactivated] = [Action WindowDeactivated]">
Notifyicon:
<tb:TaskbarIcon IconSource="{StaticResource Icon}" cal:Message.Attach="[Event TrayLeftMouseDown] = [Action ShowHide]">
<tb:TaskbarIcon.ContextMenu>
<ContextMenu>
<MenuItem Header="Zamknij" cal:Message.Attach="[Event Click] = [Action Close]"/>
</ContextMenu>
</tb:TaskbarIcon.ContextMenu>
</tb:TaskbarIcon>
型号代码:
public void ShowHide()
{
if (WindowState == Dictionary.State_MINIMIZED)
{
Show();
}
else
{
Hide();
}
}
//Used to minimize window if got covered by the other.
public void WindowDeactivated()
{
ShowHide();
}
private void Show()
{
WindowState = Dictionary.State_NORMAL;
IsTopmost = true;
IsTopmost = false;
ChangeActivated = true;
}
private void Hide()
{
//IsTaskbarVisible is a workaround to prevent showing minimized window in left bottom corner of the screen
IsTaskbarVisible = true;
WindowState = Dictionary.State_MINIMIZED;
IsTaskbarVisible = false;
ChangeActivated = false;
}
窗口代码:
public static readonly DependencyProperty ActivatedProperty =
DependencyProperty.Register(
"ChangeActivated",
typeof(Boolean),
typeof(CustomWindow),
new PropertyMetadata(OnActivatedChanged));
public Boolean ChangeActivated
{
get { return (Boolean)GetValue(ActivatedProperty); }
set { SetValue(ActivatedProperty, value); }
}
static void OnActivatedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
var d = (CustomWindow)dependencyObject;
if (d.ChangeActivated)
{
d.Activate();
}
}
问题是,当用户通过单击图标显示窗口并单击其他窗口将其隐藏时,此解决方案有效。如果用户单击图标,然后再次单击以隐藏窗口,它将消失并再次显示,原因是单击图标(位于窗口外部)会触发停用事件,然后由于执行鼠标单击而再次触发ShowHide。< / p>
有没有可以让我实现Windows任务栏图标行为的解决方案?