C# 查找停靠在左侧/右侧的窗口

C# 查找停靠在左侧/右侧的窗口,c#,wpf,xaml,C#,Wpf,Xaml,有没有办法找到一个事件(或属性、方法或类似的东西)来检测左侧或右侧的窗口停靠 说明: 使用WindowsState属性,您可以发现,当windows在这三种状态之间更改状态时,正常/最小化/最大化。Windows 7之后,您可以有两种停靠方式“停靠到左侧”和“停靠到右侧”。在窗口类中找不到任何属性或事件 您可以使用WinKey+left将窗口停靠在左侧,也可以使用WinKey+right将窗口停靠在右侧 问题: 在停靠到左侧或右侧后,我需要在窗口中进行一些更改。我需要WPF/XAML中的一个

有没有办法找到一个事件(或属性、方法或类似的东西)来检测左侧或右侧的窗口停靠

说明:

  • 使用WindowsState属性,您可以发现,当windows在这三种状态之间更改状态时,正常/最小化/最大化。Windows 7之后,您可以有两种停靠方式“停靠到左侧”和“停靠到右侧”。在窗口类中找不到任何属性或事件
  • 您可以使用WinKey+left将窗口停靠在左侧,也可以使用WinKey+right将窗口停靠在右侧
问题:


在停靠到左侧或右侧后,我需要在窗口中进行一些更改。我需要WPF/XAML中的一个触发器,但我找不到任何与向左/向右停靠相关的属性或事件。

没有任何特殊事件,因为向左/向右“停靠”与最小化/最大化不同,它不是一种特殊的操作,只是一种重新定位窗口的特殊方式。用户可以通过还原、移动和调整窗口大小来精确模拟“停靠”。因此,您的UI逻辑似乎有问题。想象一下,用户恢复窗口,然后调整其大小,使其占据靠近屏幕右边缘的大约半个屏幕。该怎么办


Protip:可能有多个监视器,您的窗口可能跨在它们之间。

我在窗口的模板中这样做:

<Border BorderBrush="Transparent" BorderThickness="5" Margin="-5"
        Effect="{DynamicResource ShadowEffect}">
  <...>
</Border>


负边距否定边框厚度。

在SizeChanged事件中,您可以检测窗口是否与以下对象对接:

bool isDocked = 
     window.WindowState == WindowState.Normal &&
     window.Width != window.RestoreBounds.Width &&
     window.Height != window.RestoreBounds.Height

至少,这是一个很好的指标。

真正的问题是你想要它做什么……当窗口停靠在左/右位置时,我需要关闭我的可自定义阴影(窗口周围),就像最大化状态一样。我有一个窗口周围的阴影,就像大多数窗口(谷歌浏览器、Visual Studio等)一样,它是自行实现的。当窗口最大化时,我有关闭阴影的触发器。当窗口停靠在左侧/右侧时,该阴影可见,并与显示器边缘保持一定距离,这非常糟糕。此阴影是WPF窗口上一种自定义实现的阴影。窗口为“WindowStyle=None”和
allowtransparency=None
和None
WindowChrome.WindowChrome
。阴影是用边框构建的,边框的阴影宽度/高度可以自定义。我明白了。您可能需要在
SizeChanged
事件处理程序中(或在
OnSizeChanged
中)检测“停靠”条件,并从那里关闭阴影-或者,更好的方法是设置依赖项属性并将边框的宽度绑定到该属性。然后,您也可以从
StateChanged
(最大化/最小化/还原)设置相同的依赖项属性以保持一致性。不幸的是,停靠到屏幕的左/右侧是一项特殊操作。本机桌面管理器仍然保存屏幕的“还原”位置。我需要这个相同的事件,因为我想在程序关闭时保存窗口位置(包括最大化状态),并在程序启动时恢复该位置。当窗口停靠时,没有要保存的“还原”位置,因为窗口状态为“正常”。
用户可以准确模拟“停靠”
这实际上不是真的。Windows会记住旧的窗口大小。当用户将窗口拖离边缘时,将恢复旧的窗口大小。所以还涉及到其他州。