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
undm_RatioY
Standardwerte sind 1.
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
Und noch eine Beobachtung: Was verursacht die "NullReferenceException" in Ihrer zweiten Alternative? Wenn 'w' null ist, hast du ein allgemeineres Problem. – haindl
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). –