3

Silverlight では、Canvas クラス (Reflector を使用) の実装は非常に単純です。3 つの依存関係プロパティ (Left、Top、ZIndex) と、何も特別なことを行わない MeasureOverride および ArrangeOverride メソッドの 2 つの ovveride が添付されています。

しかし、私の実装を次のように使用すると:

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>
4

3 に答える 3

2

これは、Reflector の Silverlight 分解エンジンのバグのようです。次の手順で、独自の Silverlight Canvas コントロールを作成できます。

  • Reflector で WPF キャンバス コントロールを逆アセンブルし、コードを Visual Studio にコピーします。
  • DependencyProperties の Bottom と Right、およびそれらの Get メソッドと Set メソッドを削除します。
  • ArrangeOverride から Bottom 句と Right 句を削除します。
  • FrameworkPropertyMetadata を PropertyMetadata に置き換えます。
  • DependencyProperty 初期化からプロパティ検証引数を削除します。

この方法で作成された Canvas には ZIndex プロパティがないことに注意してください。

于 2010-06-26T16:17:34.587 に答える
0

あなたが言ったように、キャンバスは左と上に添付されたプロパティを持つパネルにすぎません。MSDNによると:

領域に対する相対座標を使用して子オブジェクトを明示的に配置できる領域を定義します。

それだけです。Canvas は、別の FrameworkElement 派生コンテナー内に明示的な場所を持つことができます。ハンドロール キャンバスが表示されない場合は、レンダリング エラーが発生している可能性があります。見やすいように背景色を変えてみましたか?

于 2009-12-15T19:59:45.067 に答える
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 はこれらのメソッドを実装していません。それはどのように機能しますか?

于 2009-12-16T10:40:28.553 に答える