Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
覆盖MeasureOverride和ArrangeOverride时,不绘制WPF UserControl_Wpf_User Controls_Measureoverride - Fatal编程技术网

覆盖MeasureOverride和ArrangeOverride时,不绘制WPF UserControl

覆盖MeasureOverride和ArrangeOverride时,不绘制WPF UserControl,wpf,user-controls,measureoverride,Wpf,User Controls,Measureoverride,我有一个用户控件,如下所示: <UserControl MaxHeight="32" MaxWidth="32" MinHeight="25" MinWidth="25"> <DockPanel> <!-- some stuff --> </DockPanel> </UserControl> 我知道我必须对UserControl的每个子级调用Measure和Arrange

我有一个用户控件,如下所示:

<UserControl
    MaxHeight="32"
    MaxWidth="32"
    MinHeight="25"
    MinWidth="25">
    <DockPanel>
        <!-- some stuff -->
    </DockPanel>
</UserControl>

我知道我必须对UserControl的每个子级调用
Measure
Arrange
。由于DocPanel是我的UserControl的唯一子项,并且(据我所知)存储在UserControl的
Content
属性中,因此我只需在这个Content属性上调用
Measure
Arrange
。但是,不显示UserControl。我做错了什么?

根据您托管UserControl的方式,可能不会使用度量阶段返回的值。如果将其设置在具有星形行/列的网格或DockPanel中,则最终大小可能完全不同

您需要对排列阶段应用类似的逻辑,因此它将有效地忽略它所提供的任何额外空间

下面的代码应该可以工作,并且更简洁一些:

protected override Size MeasureOverride(Size availableSize) {
    var desiredSize = base.MeasureOverride(availableSize);
    var sideLength = Math.Min(desiredSize.Width, desiredSize.Height);

    desiredSize.Width = sideLength;
    desiredSize.Height = sideLength;

    return desiredSize;
}

protected override Size ArrangeOverride(Size finalSize) {
    var sideLength = Math.Min(this.DesiredSize.Width, this.DesiredSize.Height);
    return base.ArrangeOverride(new Size(sideLength, sideLength));
}
protected override Size MeasureOverride(Size availableSize) {
    var desiredSize = base.MeasureOverride(availableSize);
    var sideLength = Math.Min(desiredSize.Width, desiredSize.Height);

    desiredSize.Width = sideLength;
    desiredSize.Height = sideLength;

    return desiredSize;
}

protected override Size ArrangeOverride(Size finalSize) {
    var sideLength = Math.Min(this.DesiredSize.Width, this.DesiredSize.Height);
    return base.ArrangeOverride(new Size(sideLength, sideLength));
}