检测用户是否在WPF中移动了窗口

3

我看到了一些帖子,但它们并没有完全回答我的问题。

我有一个父窗口,在其LocationChanged事件中,它将抓取一个子窗口,并以“捕捉”方式移动它。我想找到一个事件并在子窗体上设置一个布尔值,该值表示:“如果用户手动移动了我,则我不会重新附加到父级。”

是否有一种方法可以检测用户是否移动了子窗口,而不是我的父窗口移动它?

我希望这样说得清楚。

1个回答

6
假设您正在使用子窗口的Owner属性将父窗口与子窗口关联,我建议使用事件驱动的方法。
在您的子窗口中创建一个事件,通知监听器将子窗口与其父窗口分离(解除关联):
```html 假设您正在使用子窗口的Owner属性将父窗口与子窗口关联,我建议使用事件驱动的方法。

在您的子窗口中创建一个事件,通知监听器将子窗口与其父窗口分离(解除关联):

```
public event EventHandler<EventArgs> DetachOwner;

您需要确定何时触发此事件。 为此,我们将在子窗口中使用三个事件:ActivatedDeactivatedLocationChangedLocationChanged将告诉我们子窗口何时移动,但我们需要过滤掉子窗口因跟随父窗口而移动的情况。为了做到这一点,我们需要知道子窗口是否正在移动并且具有焦点。要跟踪子窗口的焦点状态,请创建一个名为HasFocus的布尔字段,并在窗口的Activated事件处理程序中将HasFocus设置为true,在窗口的Deactivated处理程序中将其设置为false。
将此添加到您的子窗口中:
private void Window_LocationChanged(object sender, EventArgs e) {
    if (HasFocus) {
        if (DetachChild != null) {
            DetachChild(this, EventArgs.Empty);
        }
    }
}

bool HasFocus;

private void Window_Activated(object sender, EventArgs e) {
    HasFocus = true;
}

private void Window_Deactivated(object sender, EventArgs e) {
    HasFocus = false;
}

在父窗口中,当您实例化子窗口时,您将订阅子窗口的DetachOwner事件:
_child = new Child();
_child.Owner = this;
// Subscribe to the DetachOwner event.
_child.DetachChild += Child_DetachOwner;

这个 DetachOwner 处理程序只是将子窗口的 Owner 属性设置为 null:

void Child_DetachOwner(object sender, EventArgs e) {
    ((Child)sender).Owner = null;
}

您可以通过在子窗口中创建一个类似的“AttachOwner”事件,并在父窗口中加入处理程序,来扩展这种重新将子窗口附着到其父窗口的方法。
void Child_AttachOwner(object sender, EventArgs e) {
    ((Child)sender).Owner = this;
}

问题解决了!而且非常干净。非常感谢Jay! - Logan B. Lehman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接