在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>
答案 0 :(得分:2)
这似乎是Reflector的Silverlight反汇编引擎中的一个错误。您可以使用以下步骤构建自己的Silverlight Canvas控件:
请注意,以这种方式创建的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没有实现这些方法。它是如何工作的?!