【问题标题】:SizeChanged event on WPF control Event-args don't return proper Height valueWPF 控件上的 SizeChanged 事件事件参数不返回正确的高度值
【发布时间】:2014-07-16 19:36:22
【问题描述】:

我正在开发一个应用程序,我需要在其中集成 UI 的缩放。虽然这很简单,但我遇到了一些问题。我的用户界面从一开始就不是特别干净且格式良好(XAML)。

我有一个看起来像这样的 Grid,它充当所有其他控件的包装器。 高度和宽度与窗口的高度和宽度相同

<Grid x:Name="parentBox" Margin="10,10,2,0" Height="511" VerticalAlignment="Top">

然后我在这个网格中得到了很多其他嵌套的网格和一些其他控件。所有控件的数量约为 200。

然后我为上面提到的名为“parentBox”的控件注册 SizeChanged 事件,并且我有以下递归算法来缩放控件。

注册活动-----

private void ParentSizeChanged(object sender, System.Windows.SizeChangedEventArgs e)
{
    if (e.PreviousSize.Width != 0 && e.PreviousSize.Height != 0)
    {
        double coefficientHeight = e.NewSize.Height / e.PreviousSize.Height;
        double coefficientWidth = e.NewSize.Width / e.PreviousSize.Width;
        Scale(Parent, coefficientWidth, coefficientHeight);
    }
}

缩放所有孩子的功能。

    private void Scale(Grid Parent, double coefficientW, double coefficientH)
    {
        if (Parent.Children.Count == 0)
        {
            return;
        }
        else
        {
            if (coefficientH > 0 && coefficientW > 0)
            {
                Parent.Width *= coefficientW;
                Parent.Height *= coefficientH;
                for (int y = 0; y < Parent.Children.Count; y++)
                {
                    var child = Parent.Children[y];
                    if (child is Grid)
                    {
                        var childG = child as Grid;
                        Scale(childG, coefficientW, coefficientH);
                    }
                    else
                    {
                        if (child is ElementRepresentation)
                        {
                            var element = child as ElementRepresentation;

                            element.Width *= coefficientW;
                            element.Height *= coefficientH;
                            if (element.Height < 25 || element.Width < 25)
                            {
                                if (!ElementNames.ContainsKey(int.Parse(element.elementNumber.Text)))
                                {
                                    ElementNames.Add(int.Parse(element.elementNumber.Text), element.ElementLongName.Text);
                                    element.ElementLongName.Text = String.Empty;
                                }
                            }
                            if (element.ElementLongName.Text == String.Empty) 
                            {
                                element.ElementLongName.Text = ElementNames[int.Parse(element.elementNumber.Text)];
                            }
                        }
                        else
                        {
                            if(child is Label)
                            {
                                var label = child as Label;
                                label.Width *= coefficientW;
                                label.Height *= coefficientH;
                            }
                        }
                    }
                }
            }
        }
    }

当我调试并缩放窗口的高度时,“parentBox”控件仅在我从宽度侧缩放窗口时触发 SizeChanged 事件,当我尝试更改高度时没有任何反应。我怀疑它是与嵌套在“parentBox”网格内的控件放置有关。

感谢您抽出宝贵时间阅读此问题。谢谢。

【问题讨论】:

  • 您知道 Grid 可以包含在调整 Grid 本身大小时自动调整大小的单元格(即行和列)?
  • @Clemens 感谢您的提示,但我遇到的问题是不同的。问题不是调整大小,而是我无法获得窗口高度的正确值(例如高度没有改变,但事实上我正在改变它)。
  • 我只是告诉你,因为在我看来你的代码完全是多余的。

标签: c# wpf user-interface


【解决方案1】:

您已为 Grid(Height="511") 定义了固定大小。

设置固定大小时不会调用大小更改事件。你没有改变宽度。这就是当你改变宽度时触发事件的原因。

您需要删除高度。默认情况下,高度和宽度将从父级应用。

问候,
达纳塞卡

【讨论】:

  • 很好的答案,我不知道这一点!
猜你喜欢
  • 2011-04-26
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多