WPF:以编程方式设置子窗口大小

时间:2016-10-12 07:08:36

标签: c# wpf resize

我需要在子窗口手动调整其父窗口大小时调整其大小。 为此,我在父窗口上创建了以下代码:

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。

1 个答案:

答案 0 :(得分:1)

好的,我找到了解决方案。 不应直接使用宽度/高度属性,而应使用相关的DependencyProperty。 即,使用w.SetValue(Window.WidthProperty, <value>);代替w.Width = <value>

相关问题