我有一个无模式对话框,它由主窗口拥有并捕捉到主窗口中的某个参考点。我这样做是通过计算屏幕坐标中参考点的左上角,并将其分配给拥有窗口的Top和Left属性。
当我打开自有的无模式对话框时,一切正常。然后,当我用鼠标移动主窗口时,我希望拥有的对话框能够同时移动。为此,我重新计算参考点的屏幕位置,并将其传递给MouseMove事件处理程序中拥有窗口的Top和Left属性。显然,这样的事情应该有效(参见线程: Lock a window position to another window? )。但是,在我的情况下,拥有的窗口不会与所有者一起移动,而是只有当我放下主窗口并将其悬停在其客户区域时,所拥有的窗口才会跳转到其预期位置。
在MFC中,我可以通过将WM_WINDOWPOSCHANGED事件发送到拥有的窗口来解决。但是我能在WPF中做些什么呢?
答案 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;
}
}
...
}