В Silverlight класс Canvas (с Reflector) имеет очень простую реализацию: 3 прикрепленных свойства зависимостей (Left, Top, ZIndex) и 2 оверида методов MeasureOverride и ArrangeOverride, которые не делают ничего особенного.
Но если я использую свою реализацию как:
class MyCanvas : Panel { /* Top and Left dependency properties implementation */ }
А затем используйте MyCanvas в XAML как стандартный Canvas.
Это не работает, как ожидалось (я вижу пустой экран).
Как был реализован 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>