如何恢复minimized/hiddenwindow?

How to restore minimized/hidden window?

我有来自 MaterialDesignInXaml 的 MaterialWindows,它可以在通知栏中最小化。

我通过将 Visibility 设置为 Collapsed 来隐藏 windows。

双击该图标会启动恢复 windows:

的命令
public RelayCommand OpenWindowsCommand => new RelayCommand(ExecuteOpenWindowsCommand);
private void ExecuteOpenWindowsCommand(object o)
{
    WindowState = WindowState.Normal;
    //Activated = true;
    //IsInForeground = true;
    //IsInForeground = false;
    //IsFocus = true;
}

我的 属性 WindowState 更改了其中的可见性并通过 OnPropertyChanded 通知更改。

windows 出现在任务栏中,但没有出现在我的屏幕前景中。

正如您在评论中看到的那样,我尝试了不同的方法来获取它但没有成功,例如:

在屏幕的最前面放一个windows有什么特别的吗?

编辑以添加示例存储库:

MainWindow.xaml

<controls:MaterialWindow
    x:Class="MinimiedWindows.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Behaviors="clr-namespace:MinimiedWindows.Behavior"
    xmlns:controls="clr-namespace:MaterialDesignExtensions.Controls;assembly=MaterialDesignExtensions"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:MinimiedWindows"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:tb="http://www.hardcodet.net/taskbar"
    Title="MainWindow"
    Width="800"
    Height="450"
    Focusable="{Binding IsFocus}"
    Icon="app.ico"
    Topmost="{Binding IsFocus}"
    Visibility="{Binding WindowsVisibility, Mode=TwoWay}"
    WindowState="{Binding WindowState}"
    mc:Ignorable="d">

    <i:Interaction.Behaviors>
        <Behaviors:ActivateBehavior Activated="{Binding Activated, Mode=TwoWay}" />
    </i:Interaction.Behaviors>

    <Grid>
        <tb:TaskbarIcon
            x:Name="myNotifyIcon"
            DoubleClickCommand="{Binding OpenWindowsCommand}"
            IconSource="{Binding NotifyIcon}"
            MenuActivation="LeftOrRightClick"
            PopupActivation="DoubleClick"
            ToolTip="aa"
            Visibility="{Binding NotifyIconVisibility}" />
    </Grid>
</controls:MaterialWindow>

MainWindows 构造函数将数据上下文设置为新的 MainViewModel。

MainViewModel.cs : (ViewModelBase 是经典的 属性 OnPropertyChanged)

public class MainViewModel : ViewModelBase
{
   public MainViewModel()
   {
   }

   #region Windows properties

   private WindowState _WindowState = WindowState.Normal;

   public WindowState WindowState
   {
      get { return _WindowState; }
      set
      {
         _WindowState = value;
         OnPropertyChanged();
         OnPropertyChanged("WindowsVisibility");
         OnPropertyChanged("NotifyIconVisibility");
      }
   }

   private Visibility _WindowsVisibility = Visibility.Visible;

   public Visibility WindowsVisibility
   {
      get
      {
         if (WindowState == WindowState.Minimized)
         {
            return Visibility.Collapsed;
         }

         return Visibility.Visible;
      }
      set { _WindowsVisibility = value; }
   }

   private bool _Activated;

   public bool Activated
   {
      get { return _Activated; }
      set
      {
         _Activated = value;
         OnPropertyChanged();
      }
   }

   private bool _IsInForeground;

   public bool IsInForeground
   {
      get { return _IsInForeground; }
      set
      {
         _IsInForeground = value;
         OnPropertyChanged();
      }
   }

   private bool _IsFocus;

   public bool IsFocus
   {
      get { return _IsFocus; }
      set
      {
         _IsFocus = value;
         OnPropertyChanged();
      }
   }

   #endregion

   #region NotifyBar

   public string NotifyIcon
   {
      get { return "app.ico"; }
   }

   public Visibility NotifyIconVisibility
   {
      get
      {
         if (WindowState == WindowState.Minimized)
         {
            return Visibility.Visible;
         }

         return Visibility.Collapsed;
      }
   }

   public RelayCommand OpenWindowsCommand => new RelayCommand(ExecuteOpenWindowsCommand);
   private void ExecuteOpenWindowsCommand(object o)
   {
      WindowState = WindowState.Normal;
      Activated = true;
   }
   #endregion
}

最后是我的 ActivateBehavior.cs

public class ActivateBehavior : Behavior<MaterialWindow>
{
   Boolean isActivated;

   public static readonly DependencyProperty ActivatedProperty =
     DependencyProperty.Register(
       "Activated",
       typeof(Boolean),
       typeof(ActivateBehavior),
       new PropertyMetadata(OnActivatedChanged)
     );

   public Boolean Activated
   {
      get { return (Boolean)GetValue(ActivatedProperty); }
      set { SetValue(ActivatedProperty, value); }
   }

   static void OnActivatedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
   {
      var behavior = (ActivateBehavior)dependencyObject;
      if (!behavior.Activated || behavior.isActivated)
         return;
      // The Activated property is set to true but the Activated event (tracked by the
      // isActivated field) hasn't been fired. Go ahead and activate the window.
      if (behavior.AssociatedObject.WindowState == WindowState.Minimized)
         behavior.AssociatedObject.WindowState = WindowState.Normal;
      behavior.AssociatedObject.Activate();
   }

   protected override void OnAttached()
   {
      AssociatedObject.Activated += OnActivated;
      AssociatedObject.Deactivated += OnDeactivated;
   }

   protected override void OnDetaching()
   {
      AssociatedObject.Activated -= OnActivated;
      AssociatedObject.Deactivated -= OnDeactivated;
   }

   void OnActivated(Object sender, EventArgs eventArgs)
   {
      this.isActivated = true;
      Activated = true;
   }

   void OnDeactivated(Object sender, EventArgs eventArgs)
   {
      this.isActivated = false;
      Activated = false;
   }
}

对于这些包,我已经安装了 Hardcodet.NotifyIcon.Wpf、MaterialDesignExtensionss 3.1.0(以及 materialDesign 依赖项)和 System.Windows.Interactivity.WPF。

将您的 ExecuteOpenWindowsCommand 更改为仅设置 Activated 属性。

private void ExecuteOpenWindowsCommand()
{
   Activated = true;
}

像这样在 ActivateBehavior 中调整 OnActivatedChanged 方法。

private static void OnActivatedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
   var behavior = (ActivateBehavior)dependencyObject;
   if (!behavior.Activated || behavior.isActivated)
      return;

   // The Activated property is set to true but the Activated event (tracked by the
   // isActivated field) hasn't been fired. Go ahead and activate the window.
   var window = behavior.AssociatedObject;
   if (window.WindowState == WindowState.Minimized)
   {
      window.WindowState = WindowState.Normal;
      SystemCommands.RestoreWindow(window);
   }

   window.Activate();
}

重要的部分是恢复window,这在以前没有发生过,它被隐藏了。然后需要激活它才能走到前台。不需要 window 状态分配,但会使 window 的恢复转换更愉快。