2016-10-12 4 views
0

Ich muss die Größe eines untergeordneten Fensters ändern, wenn die Größe des übergeordneten Elements manuell geändert wird. Um dies zu tun, habe ich den folgenden Code auf dem Fenster parent:WPF: Untergeordnete Fenstergröße programmatisch festlegen

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; 
     } 
    } 
}; 

Die Linien

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

nicht funktioniert in dem Sinne, dass sie absolut keine Wirkung auf das Kind Fenstergröße .

Nach einigen Recherchen habe ich auch die folgenden zwei Alternativen ausprobiert, aber die erste hat auch keine Auswirkungen auf die Fenstergröße, wo der zweite Absturz mit einer 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; 

Also, wie soll ich die Größe des untergeordneten Fensters ändern, damit sein Render effektiv verkleinert wird?

EDIT:

Einige Präzisierungen:

  • Der SizeChanged Handler wird nur in dem übergeordneten Fenster genannt.
  • m_RatioX und m_RatioY Standardwerte sind 1.
+0

Ich überprüfte Ihren ursprünglichen Code (ohne die zwei Alternativen) und es scheint gut zu funktionieren. Zwei Dinge, die Sie überprüfen müssen: 1.) Es funktioniert nur, wenn die Werte von 'm_RatioX' und' m_RatioY' nie '0d' sind. Was sind die anfänglichen Werte in Ihrem Fall? 2.) Abonnieren Sie die 'SizeChanged' nur im Elternfenster oder auch in den Kindfenstern? Wenn Sie das 'SizeChanged' auch in den Child-Fenstern behandeln, werden die Effekte auf eine seltsame optische Weise kaskadieren. – haindl

+0

Und noch eine Beobachtung: Was verursacht die "NullReferenceException" in Ihrer zweiten Alternative? Wenn 'w' null ist, hast du ein allgemeineres Problem. – haindl

+0

Ich habe einige Änderungen an der ersten Nachricht vorgenommen, um einige Punkte zu klären. Außerdem wird 'NullReferenceException' ausgelöst, wenn versucht wird,' w' in 'Application.Current.MainWIndow' zu beeinflussen, aber' w' ist nicht 'null' (davon bin ich mir sicher). –

Antwort

0

Ok, ich habe eine Lösung gefunden. Anstatt die Width/Height-Eigenschaften direkt zu verwenden, sollte man den entsprechenden DependencyProperty verwenden. , d. H. Verwendung w.SetValue(Window.WidthProperty, <value>); anstelle von w.Width = <value>.

Verwandte Themen