【问题标题】:WPF UserControl is not drawn when overriding MeasureOverride and ArrangeOverride覆盖 MeasureOverride 和 ArrangeOverride 时不绘制 WPF UserControl
【发布时间】:2011-01-25 10:46:39
【问题描述】:

我有一个如下所示的 UserControl:

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

除了最小/最大尺寸约束之外,我希望控件始终使用Width = Height 绘制。所以我覆盖了MeasureOverrideArrangeOverride

protected override Size MeasureOverride(Size availableSize)
{
    var resultSize = new Size(0, 0);
    ((UIElement)Content).Measure(availableSize);
    var sideLength = Math.Min(((UIElement)Content).DesiredSize.Width, ((UIElement)Content).DesiredSize.Height);

    resultSize.Width = sideLength;
    resultSize.Height = sideLength;

    return resultSize;
}

protected override Size ArrangeOverride(Size finalSize)
{
    ((UIElement)Content).Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
    return finalSize;
}

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

【问题讨论】:

    标签: wpf user-controls measureoverride


    【解决方案1】:

    根据您托管 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));
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 2013-11-09
      • 2021-10-01
      • 2012-02-01
      • 2011-02-04
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多