C# 如何恢复最小化/隐藏窗口?
我有MaterialDesignInXaml中的MaterialWindow,可以在通知栏中最小化 我通过将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
可见性设置为折叠来隐藏窗口
双击图标将启动一个命令以还原窗口:
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();
}