如何在WPF中与所有者一起移动拥有的窗口?

时间:2012-03-15 15:06:08

标签: wpf

我有一个无模式对话框,它由主窗口拥有并捕捉到主窗口中的某个参考点。我这样做是通过计算屏幕坐标中参考点的左上角,并将其分配给拥有窗口的Top和Left属性。

当我打开自有的无模式对话框时,一切正常。然后,当我用鼠标移动主窗口时,我希望拥有的对话框能够同时移动。为此,我重新计算参考点的屏幕位置,并将其传递给MouseMove事件处理程序中拥有窗口的Top和Left属性。显然,这样的事情应该有效(参见线程: Lock a window position to another window? )。但是,在我的情况下,拥有的窗口不会与所有者一起移动,而是只有当我放下主窗口并将其悬停在其客户区域时,所拥有的窗口才会跳转到其预期位置。

在MFC中,我可以通过将WM_WINDOWPOSCHANGED事件发送到拥有的窗口来解决。但是我能在WPF中做些什么呢?

1 个答案:

答案 0 :(得分:2)

以下代码对我来说非常有用。还有一些更复杂的绑定解决方案。

在主窗口中获取LocationChanged的事件:

<Window ... LocationChanged="Window_LocationChanged">

在代码隐藏中,将对话框保留为MainWindow的字段。然后有以下代码:

public partial class MainWindow : Window
{
    // keep a reference to the dialog
    Dialog m_dlg;

    public MainWindow( ) {
        InitializeComponent( );
    }

    ...

    private void createDialog( ) {
        m_dlg = new Dialog( );
        realign( );
        m_dlg.Show( );
    }

    // change the dialog left and right when the main window moves:
    private void Window_LocationChanged( object sender, EventArgs e ) {
        realign( );
    }

    private void realign( ) {
        if( m_dlg != null ) {
            m_dlg.Left = this.Left + 30;
            m_dlg.Top = this.Top + 30;
        }
    }

    ...
}