Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何恢复最小化/隐藏窗口?_C#_Wpf_Mvvm_Material Design In Xaml - Fatal编程技术网

C# 如何恢复最小化/隐藏窗口?

C# 如何恢复最小化/隐藏窗口?,c#,wpf,mvvm,material-design-in-xaml,C#,Wpf,Mvvm,Material Design In Xaml,我有MaterialDesignInXaml中的MaterialWindow,可以在通知栏中最小化 我通过将可见性设置为折叠来隐藏窗口 双击图标将启动一个命令以还原窗口: public RelayCommand OpenWindowsCommand => new RelayCommand(ExecuteOpenWindowsCommand); private void ExecuteOpenWindowsCommand(object o) { WindowState = Windo

我有MaterialDesignInXaml中的MaterialWindow,可以在通知栏中最小化

我通过将
可见性设置为
折叠来隐藏窗口

双击图标将启动一个命令以还原窗口:

public RelayCommand OpenWindowsCommand => new RelayCommand(ExecuteOpenWindowsCommand);
private void ExecuteOpenWindowsCommand(object o)
{
    WindowState = WindowState.Normal;
    //Activated = true;
    //IsInForeground = true;
    //IsInForeground = false;
    //IsFocus = true;
}
我的属性
WindowState
更改了其中的可见性,并使用
onpropertychand
通知更改

窗口出现在任务栏中,但不出现在我的屏幕的前景上

正如您在评论中所看到的,我尝试了不同的方法,但没有成功,如:

  • Focusable
    属性
  • 最顶层
    属性
  • Top
    属性
  • 甚至是激活窗口的行为
有什么特别的东西可以在屏幕的前景放一个窗口吗

编辑以添加样本回购:

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>
最后是我的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;
   }
}
公共类ActivateBehavior:行为
{
布尔值被激活;
公共静态只读从属属性ActivatedProperty=
从属属性。寄存器(
“已激活”,
类型(布尔),
类型(激活行为),
新属性元数据(OnActivatedChanged)
);
公共布尔激活
{
获取{return(Boolean)GetValue(ActivatedProperty);}
set{SetValue(ActivatedProperty,value);}
}
ActivatedChanged上的静态无效(DependencyObject DependencyObject,DependencyPropertyChangedEventArgs e)
{
变量行为=(ActivateBehavior)dependencyObject;
如果(!behavior.Activated | | behavior.isActivated)
返回;
//Activated属性设置为true,但激活的事件(由
//isActivated字段)尚未启动。请继续并激活窗口。
如果(behavior.AssociatedObject.WindowsState==WindowsState.Minimized)
behavior.AssociatedObject.WindowsState=WindowsState.Normal;
behavior.AssociatedObject.Activate();
}
受保护的覆盖无效附加()
{
AssociatedObject.Activated+=OnActivated;
AssociatedObject.Deactivated+=OnDeactivated;
}
附加时受保护的覆盖无效()
{
AssociatedObject.Activated-=OnActivated;
AssociatedObject.Deactivated-=OnDeactivated;
}
已激活无效(对象发送方、事件参数、事件参数)
{
this.isActivated=true;
激活=真;
}
无效已激活(对象发送方,EventArgs EventArgs)
{
this.isActivated=false;
激活=错误;
}
}

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

executepenwindowscond
更改为仅设置
Activated
属性

private void ExecuteOpenWindowsCommand()
{
   Activated = true;
}
像这样调整
activatebhavior
中的
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();
}

重要的部分是恢复窗口,这在以前没有发生过,它是隐藏的。然后,它需要被激活才能进入前台。不需要窗口状态关联,但会使窗口的还原转换更愉快。

是否尝试调用
this.Activate()
this.Dispatcher.BeginInvoke(新操作(()=>this.Activate())、System.Windows.Threading.DispatcherPriority.Background)
?是,我的行为有一个方法叫做activate函数。我也尝试过使用dispatcher,但它没有改变任何东西。请提供您的问题的详细信息。@mm8我用一个小的repo编辑了我的帖子,希望它足以复制它。我尝试了您的解决方案,但没有成功。。。该方法返回“true”,但应用程序不在前台。在前景中设置的条件似乎适合me@Elsassmania我已经根据您的编辑更改了答案,它适用于您的样本。顺便说一句,“现代应用程序”可能指的是metro/universal/windows应用商店应用程序。通过您的修改,它可以完美地工作!非常感谢。
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();
}