Silverlight Canvas:它是如何工作的?

时间:2009-12-15 19:50:43

标签: silverlight canvas reflector

在silverlight中,Canvas类(带有Reflector)具有非常简单的实现:3个附加的依赖属性(Left,Top,ZIndex)和2个MeasureOverride和ArrangeOverride方法的ovverides,它们没有什么特别的。

但如果我使用我的实现,如:

class MyCanvas : Panel { /* Top and Left dependency properties implementation */ }

然后像标准Canvas一样在XAML中使用MyCanvas。 这没有按预期工作(我看到空屏幕)。

Canvas是如何实施的?

- 附加代码: MyCanvas.cs

public class MyCanvas : Panel
{
    public static double GetTop(DependencyObject obj)
    {
        return (double)obj.GetValue(TopProperty);
    }

    public static void SetTop(DependencyObject obj, double value)
    {
        obj.SetValue(TopProperty, value);
    }

    // Using a DependencyProperty as the backing store for Top.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TopProperty =
        DependencyProperty.RegisterAttached("Top", typeof(double), typeof(MyCanvas), new PropertyMetadata(0.0));


    public static double GetLeft(DependencyObject obj)
    {
        return (double)obj.GetValue(LeftProperty);
    }

    public static void SetLeft(DependencyObject obj, double value)
    {
        obj.SetValue(LeftProperty, value);
    }

    // Using a DependencyProperty as the backing store for Left.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty LeftProperty =
        DependencyProperty.RegisterAttached("Left", typeof(double), typeof(MyCanvas), new PropertyMetadata(0.0));
}

在XAML中使用,如:

<local:MyCanvas>
    <Rectangle 
        local:MyCanvas.Left="10"
        local:MyCanvas.Top="10"
        Width="100"
        Height="100"
        Fill="Black" />
</local:MyCanvas>

如果将MyCanvas更改为标准Canvas,我可以在位置10,10查看黑色矩形。

<Canvas>
    <Rectangle 
        Canvas.Left="10"
        Canvas.Top="10"
        Width="100"
        Height="100"
        Fill="Black" />
</Canvas>

3 个答案:

答案 0 :(得分:2)

这似乎是Reflector的Silverlight反汇编引擎中的一个错误。您可以使用以下步骤构建自己的Silverlight Canvas控件:

  • 在Reflector中反汇编WPF画布控件并将代码复制到Visual Studio。
  • 删除DependencyProperties Bottom和Right,以及它们的Get和Set方法。
  • 从ArrangeOverride中删除Bottom和Right子句。
  • 用PropertyMetadata替换FrameworkPropertyMetadata。
  • 从DependencyProperty初始化中删除属性验证参数。

请注意,以这种方式创建的Canvas没有ZIndex属性。

答案 1 :(得分:0)

正如你所说,Canvas只不过是一个具有Left和Top附加属性的Panel。根据{{​​3}}:

  

定义您可以在其中的区域   通过显式定位子对象   使用相对于的坐标   该地区。

就是这样 - 一个Canvas可以在另一个FrameworkElement派生容器中有一个显式位置。如果您没有看到手动滚动画布,则可能会出现渲染错误。您是否尝试过更改背景颜色以确保可以看到它?

答案 2 :(得分:0)

我可以实现MeasureOverride和ArrangeOvverride类似的东西:

    protected override Size MeasureOverride(Size availableSize)
    {
        foreach (var element in Children)
            element.Measure(availableSize);
        return base.MeasureOverride(availableSize);
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        foreach (var element in Children)
        {
            var left = GetLeft(element);
            var top = GetTop(element);
            var size = element.DesiredSize;
            element.Arrange(
                new Rect(left, top, size.Width, size.Height)
                );
        }
        return base.ArrangeOverride(finalSize);
    }

我可以在我的MyCanvas用法示例中查看黑色矩形。

但是Canvas没有实现这些方法。它是如何工作的?!

相关问题