【问题标题】:Custom control size on InitializeComponent()InitializeComponent() 上的自定义控件大小
【发布时间】:2012-01-21 01:13:39
【问题描述】:

我正在尝试在 WPF 中创建自定义用户控件。当我以后在另一个窗口中使用控件时,我希望能够手动设置大小。

作为一个简短的测试,我刚刚制作了一个包含网格内的画布的控件,它完全填充了控件。初始化时,它在自身内部绘制一个矩形,显示其大小。然后我把它放在一个窗口上,让它变成我想要的任何大小。

但是我现在有问题,好像我绘制了我绘制的矩形的高度

this.ActualHeight

然后当控件初始化时,这个值仍然是 0,所以我什么也得不到。如果相反,我使用

this.Height

然后我得到了我在设计期间制作的高度,而不是我随后在窗口中制作的尺寸。

高度和宽度似乎是在 XAML 设计器中设置的,所以我不知道该怎么做。

有没有简单的方法解决这个问题?

【问题讨论】:

    标签: c# wpf .net-4.0


    【解决方案1】:

    我认为您正在经历的是WPF performs layout 的情况,特别是 Canvas 不参与布局的情况。

    在您的具体情况下,您将 Rectangle 的宽度设置为 Canvas.ActualWidth?除非已明确设置画布的宽度/高度,否则 ActualWidth/Actualheight 将为零,因此您无法获得定位 Canvas 子级的参考点。我要做的是将画布宽度和高度绑定到其父容器(或在代码中设置)以正确传播 ActualWidth / ActualHeight。

    作为兴趣点,试试这个例子来了解 WPF 布局引擎是如何工作的。以下代码可以强制 FrameworkElement 上的高度以将 Width、Height 设置为正常,然后在相关元素上强制布局(测量、排列通道)。这会导致 WPF 布局引擎测量/排列元素并将 Width、Height 传播到 ActualWidth、ActualHeight。

    例如:

    // Set the width, height you want
    element.Width = 123;
    element.Height = 456;
    
    // Force measure/arrange
    element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
    element.Arrange(new Rect(0, 0, element.DesiredWidth, element.DesiredHeight));   
    
    // Subject to sufficient space, the actual width, height will have 
    // the values propagated from width/height after a measure and arrange call
    double width = element.ActualWidth;
    double height = element.ActualHeight;
    

    为清楚起见,另请参阅this related question。我偶尔使用上述方法来测量文本块中的文本,以便在画布上正确定位。

    【讨论】:

    • 再次感谢。我还偶然发现了另一种方法,即在我的控件上的 SizeChanged() 事件之后启动重绘,无论如何我都需要这样做才能调整屏幕大小。
    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多