【发布时间】:2019-11-18 14:00:58
【问题描述】:
我在 WPF (C#) 中遇到了一个问题,我需要在父窗口中的某个点上放置一个弹出窗口。
我使用Application.Current.MainWindow.Left 和Application.Current.MainWindow.Top 获得父位置,只要我不使用Windows 快捷方式Windows + Shift + ◄/►。如果我使用快捷方式,属性将保持与移动窗口之前相同。
窗口必须是WindowState.Maximized,如果它没有最大化,它可以工作。
我也试过用Window.GetWindow(this)代替Application.Current.MainWindow,结果是一样的。
似乎Application.Current.MainWindow 没有发生 positionchanged 事件,也没有更新 Left 和 Top 属性。
我在 SO 或 Google 上没有找到任何关于此的内容。 非常感谢您提供解决方法、提示或解决方案。
【问题讨论】:
-
我不确定我是否理解
Windows + Shift + Cursor Left/Right快捷方式,您的意思是Windows + Shift + Left/Right arrow吗?使用此快捷方式时,我也无法重现该问题。也许您的Application.Current.MainWindow未设置为正确的Window? -
是的,我的意思是方向键,我的错。这是正确的窗口,如果我用鼠标拖放它会按预期更改左侧。
-
您能否创建一个新的空 WPF 应用程序并将您的
MainWindow的默认构造函数替换为以下调试代码:public MainWindow() { InitializeComponent(); async Task Test() { while (true) { Console.WriteLine((Left, Top)); await Task.Delay(500); } }; Test(); }。它在输出窗口中显示Window的当前位置,即使使用快捷方式也对我有用。它不适合你吗? -
我用你的测试场景重现了这个错误,这个问题只有在 WindowState 被最大化时才会出现。
-
尝试使用 _actualLeft 和 _actualTop 字段。这种特殊情况的代码可以在here找到。