2016-10-12 127 views
0

我需要調整其父級手動調整大小的子窗口。 爲了做到這一點,我做了父窗口下面的代碼:WPF:設置子窗口大小programmaticaly

SizeChanged += (sender, e) => 
{ 
    if (e.PreviousSize.Width != 0 && e.PreviousSize.Height != 0) 
    { 
     m_RatioX *= e.NewSize.Width/e.PreviousSize.Width; 
     m_RatioY *= e.NewSize.Height/e.PreviousSize.Height; 
    } 
    WPFWindow p = ((WPFWindow)sender); 
    foreach (WPFWindow w in p.OwnedWindows) 
    { 
     if (w.m_doStretch) 
     { 
      // this work fine 
      w.Left *= m_RatioX/w.m_RatioX; 
      w.Top *= m_RatioY/w.m_RatioY; 
      w.Canvas.RenderTransform = new ScaleTransform(m_RatioX, m_RatioY); 

      // but not for the size modification 
      w.Width *= m_RatioX/w.m_RatioX; 
      w.Height *= m_RatioY/w.m_RatioY; 
      w.m_RatioX = m_RatioX; 
      w.m_RatioY = m_RatioY; 
     } 
    } 
}; 

線條

w.Width *= m_RatioX/w.m_RatioX; 
w.Height *= m_RatioY/w.m_RatioY; 

不會在這個意義上的作品,他們對孩子的窗口大小完全沒有影響。

經過一番研究,我也嘗試了以下兩種替代方案,但第一種方法對第二次崩潰時的窗口大小也沒有影響,其中NullReferenceException

// first alternative 
Window.GetWindow(w).Width = Window.GetWindow(w).Width * m_RatioX/w.m_RatioX; 
Window.GetWindow(w).Height = Window.GetWindow(w).Height * m_RatioY/w.m_RatioY; 

// second one 
Application.Current.MainWindow = w; 
Application.Current.MainWindow.Width = Application.Current.MainWindow.Width * m_RatioX/w.m_RatioX; 
Application.Current.MainWindow.Height = Application.Current.MainWindow.Height * m_RatioY/w.m_RatioY; 

那麼,我應該如何修改子窗口的大小,以便它的渲染有效地調整大小?

編輯:

一些精度:

  • SizeChanged處理程序僅在父窗口調用。
  • m_RatioXm_RatioY默認值是1。
+0

我檢查了你的原始代碼(沒有兩個選擇),它似乎工作正常。你需要檢查兩件事:1)只有當m_RatioX和m_RatioY的值不是0d時它才起作用。你的情況是什麼初始值? 2.)您是僅在父窗口還是在子窗口中訂閱'SizeChanged'?如果你正在處理子窗口中的'SizeChanged',那麼效果將以一種奇怪的光學方式級聯。 – haindl

+0

另一種觀察:在第二種選擇中是什麼導致了'NullReferenceException'?如果'w'爲空,那麼你有一個更普遍的問題。 – haindl

+0

我對第一條消息做了一些編輯,以澄清一些觀點。另外,''NullReferenceException'在試圖影響'w'到'Application.Current.MainWIndow'時引發,但'w'不是'null'(我確信)。 –

回答

0

好吧,我已經找到了解決辦法。 而不是直接使用寬度/高度屬性,應該使用相關的DependencyProperty。 即使用w.SetValue(Window.WidthProperty, <value>);而不是w.Width = <value>