调整画布项目的大小

亚当

我正在尝试创建画布,当画布本身被调整大小时,该画布将调整其子对象的大小。因此,我创建了一个自己的类,该类继承自canvas,并覆盖了ArrangeOverride方法,在其中我为画布中定义的所有子级设置位置和大小。一切看起来都很好,但是当我调整应用程序窗口的大小时,项目的大小并未调整为正确的大小或位置。

这是简化的示例,尝试将其元素对齐到画布的右边界:

Xaml代码:

<Border BorderBrush="Black" BorderThickness="1" Margin="10" SnapsToDevicePixels="True">
    <l:CustomPanel>
        <Rectangle Fill="Red" />
        <Button>a</Button>
    </l:CustomPanel>
</Border>

CustomPanel:

public class CustomPanel : Canvas
{
    protected override System.Windows.Size ArrangeOverride(System.Windows.Size arrangeSize)
    {
        var ret = base.ArrangeOverride(arrangeSize);
        var top = 0;

        foreach(UIElement child in Children)
        {                               
            Canvas.SetLeft(child, arrangeSize.Width - 20.0);                
            child.SetValue(WidthProperty, arrangeSize.Width - Canvas.GetLeft(child));                
            Canvas.SetTop(child, top);
            child.SetValue(HeightProperty, 20.0);
            top += 30;
        }
        return ret;
    }
}

当我更改窗口的宽度时,有时画布在此图像上看起来像:

错误

然后,如果我更改窗口的高度,则项目将移动到正确的位置

我究竟做错了什么?我试图将SnapsToDevicePixels设置为True,但对我来说不起作用。:-(

克莱门斯

您的自定义面板应源自Panel而不是Canvas和覆盖MeasureOverrideandArrangeOverride方法。此外,应该定义它自己的附加属性为子元素的布局,如四个属性RelativeXRelativeYRelativeWidthRelativeHeight如下所示。

它将在XAML中像这样使用:

<local:RelativeLayoutPanel>
    <Rectangle Fill="Red"
               local:RelativeLayoutPanel.RelativeX="0.2"
               local:RelativeLayoutPanel.RelativeY="0.1"
               local:RelativeLayoutPanel.RelativeWidth="0.6"
               local:RelativeLayoutPanel.RelativeHeight="0.8"/>
</local:RelativeLayoutPanel>

这是实现:

public class RelativeLayoutPanel: Panel
{
    public static readonly DependencyProperty RelativeXProperty = DependencyProperty.RegisterAttached(
        "RelativeX", typeof(double), typeof(RelativeLayoutPanel),
        new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange));

    public static readonly DependencyProperty RelativeYProperty = DependencyProperty.RegisterAttached(
        "RelativeY", typeof(double), typeof(RelativeLayoutPanel),
        new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange));

    public static readonly DependencyProperty RelativeWidthProperty = DependencyProperty.RegisterAttached(
        "RelativeWidth", typeof(double), typeof(RelativeLayoutPanel),
        new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange));

    public static readonly DependencyProperty RelativeHeightProperty = DependencyProperty.RegisterAttached(
        "RelativeHeight", typeof(double), typeof(RelativeLayoutPanel),
        new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange));

    public static double GetRelativeX(UIElement element)
    {
        return (double)element.GetValue(RelativeXProperty);
    }

    public static void SetRelativeX(UIElement element, double value)
    {
        element.SetValue(RelativeXProperty, value);
    }

    public static double GetRelativeY(UIElement element)
    {
        return (double)element.GetValue(RelativeYProperty);
    }

    public static void SetRelativeY(UIElement element, double value)
    {
        element.SetValue(RelativeYProperty, value);
    }

    public static double GetRelativeWidth(UIElement element)
    {
        return (double)element.GetValue(RelativeWidthProperty);
    }

    public static void SetRelativeWidth(UIElement element, double value)
    {
        element.SetValue(RelativeWidthProperty, value);
    }

    public static double GetRelativeHeight(UIElement element)
    {
        return (double)element.GetValue(RelativeHeightProperty);
    }

    public static void SetRelativeHeight(UIElement element, double value)
    {
        element.SetValue(RelativeHeightProperty, value);
    }

    protected override Size MeasureOverride(Size availableSize)
    {
        availableSize = new Size(double.PositiveInfinity, double.PositiveInfinity);

        foreach (UIElement element in InternalChildren)
        {
            element.Measure(availableSize);
        }

        return new Size();
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        foreach (UIElement element in InternalChildren)
        {
            element.Arrange(new Rect(
                GetRelativeX(element) * finalSize.Width,
                GetRelativeY(element) * finalSize.Height,
                GetRelativeWidth(element) * finalSize.Width,
                GetRelativeHeight(element) * finalSize.Height));
        }

        return finalSize;
    }
}

如果您不需要四个布局属性可以由样式设置程序等独立绑定或设置,则可以将其替换为一个类型的附加属性Rect

<local:RelativeLayoutPanel>
    <Rectangle Fill="Red" local:RelativeLayoutPanel.RelativeRect="0.2,0.1,0.6,0.8"/>
</local:RelativeLayoutPanel>

使用以下更短的实现:

public class RelativeLayoutPanel: Panel
{
    public static readonly DependencyProperty RelativeRectProperty = DependencyProperty.RegisterAttached(
        "RelativeRect", typeof(Rect), typeof(RelativeLayoutPanel),
        new FrameworkPropertyMetadata(new Rect(), FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange));

    public static Rect GetRelativeRect(UIElement element)
    {
        return (Rect)element.GetValue(RelativeRectProperty);
    }

    public static void SetRelativeRect(UIElement element, Rect value)
    {
        element.SetValue(RelativeRectProperty, value);
    }

    protected override Size MeasureOverride(Size availableSize)
    {
        availableSize = new Size(double.PositiveInfinity, double.PositiveInfinity);

        foreach (UIElement element in InternalChildren)
        {
            element.Measure(availableSize);
        }

        return new Size();
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        foreach (UIElement element in InternalChildren)
        {
            var rect = GetRelativeRect(element);

            element.Arrange(new Rect(
                rect.X * finalSize.Width,
                rect.Y * finalSize.Height,
                rect.Width * finalSize.Width,
                rect.Height * finalSize.Height));
        }

        return finalSize;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用jQuery调整大小以显示项目的大小

来自分类Dev

调整画布图像的大小

来自分类Dev

无法调整画布大小

来自分类Dev

如何调整画布大小

来自分类Dev

调整画布图像的大小

来自分类Dev

调整画布元素的大小

来自分类Dev

调整同级项目的大小时,网格项目的大小保持固定

来自分类Dev

在WxPython BoxSizer中均匀调整多个项目的大小?

来自分类Dev

如何自动调整网格项目的大小以适合父高

来自分类Dev

调整SVG元素的大小:包含多个项目的最佳做法

来自分类Dev

在WxPython BoxSizer中均匀调整多个项目的大小?

来自分类Dev

某些浮动项目的大小无法适当调整(CSS / XHTML)

来自分类Dev

调整网格项目的大小属性会导致其他网格项目的重叠

来自分类Dev

调整画布大小而不裁剪

来自分类Dev

调整画布元素/形状的大小

来自分类Dev

在画布中调整图像大小

来自分类Dev

使用 getImageData 调整画布大小

来自分类Dev

画布调整大小 photoshop 脚本

来自分类Dev

带有溢出的包含项目的可调整大小的容器。组合溢出:可见且可调整大小

来自分类Dev

画布粒子-在“窗口调整大小”上更新画布大小

来自分类Dev

在窗口调整大小上动态调整画布大小

来自分类Dev

在 HTML 中调整 SVG 大小而不调整画布大小

来自分类Dev

如何在没有百分比的情况下调整弹性项目的大小?

来自分类Dev

在Android上隐藏TabbedPage所选项目的标签或“调整标签大小”文本

来自分类Dev

调整窗口大小时如何更改轮播项目的滚动数量?

来自分类Dev

如何调整TInputQueryWizardPage页面项目的输入编辑控件的大小?

来自分类Dev

同位素,调整窗口大小时项目的绝对位置不正确

来自分类Dev

根据列表中的最大高度/宽度调整所有项目的大小

来自分类Dev

使用.scale()调整HTML画布的大小

Related 相关文章

  1. 1

    使用jQuery调整大小以显示项目的大小

  2. 2

    调整画布图像的大小

  3. 3

    无法调整画布大小

  4. 4

    如何调整画布大小

  5. 5

    调整画布图像的大小

  6. 6

    调整画布元素的大小

  7. 7

    调整同级项目的大小时,网格项目的大小保持固定

  8. 8

    在WxPython BoxSizer中均匀调整多个项目的大小?

  9. 9

    如何自动调整网格项目的大小以适合父高

  10. 10

    调整SVG元素的大小:包含多个项目的最佳做法

  11. 11

    在WxPython BoxSizer中均匀调整多个项目的大小?

  12. 12

    某些浮动项目的大小无法适当调整(CSS / XHTML)

  13. 13

    调整网格项目的大小属性会导致其他网格项目的重叠

  14. 14

    调整画布大小而不裁剪

  15. 15

    调整画布元素/形状的大小

  16. 16

    在画布中调整图像大小

  17. 17

    使用 getImageData 调整画布大小

  18. 18

    画布调整大小 photoshop 脚本

  19. 19

    带有溢出的包含项目的可调整大小的容器。组合溢出:可见且可调整大小

  20. 20

    画布粒子-在“窗口调整大小”上更新画布大小

  21. 21

    在窗口调整大小上动态调整画布大小

  22. 22

    在 HTML 中调整 SVG 大小而不调整画布大小

  23. 23

    如何在没有百分比的情况下调整弹性项目的大小?

  24. 24

    在Android上隐藏TabbedPage所选项目的标签或“调整标签大小”文本

  25. 25

    调整窗口大小时如何更改轮播项目的滚动数量?

  26. 26

    如何调整TInputQueryWizardPage页面项目的输入编辑控件的大小?

  27. 27

    同位素,调整窗口大小时项目的绝对位置不正确

  28. 28

    根据列表中的最大高度/宽度调整所有项目的大小

  29. 29

    使用.scale()调整HTML画布的大小

热门标签

归档