使NotifyIcon click事件的行为与任务栏图标的

时间:2019-03-26 08:37:18

标签: c# wpf mvvm notifyicon

我正在使用带有MVVM模式和Caliburn Micro的WPF用C#编写程序。我不希望我的应用程序具有任务栏图标,我希望它只存在于系统托盘中。我通过使用NotifyIcon实现了这一点,但是问题是我无法使通知图标在单击时像任务栏图标一样起作用。

如果您查看任务栏图标,请单击行为:

  1. 如果窗口当前处于活动状态,则单击将其最小化。
  2. 如果窗口失去焦点或被其他窗口覆盖,则单击使其可见并具有焦点。
  3. 如果将窗口最小化,则倾斜将使其可见并具有焦点。

我试图通过多种方式实现这一目标,但没有一个成功。

我现在拥有的是一个附加到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任务栏图标行为的解决方案?

0 个答案:

没有答案