1

空の Silverlight キャンバスに楕円を追加する単純なハンドラーがあります。

    private void UCLoaded(object sender, RoutedEventArgs e)
    {
        var geometry = MakeElipse(20, 15, new Point(100, 100));
        var ellipsePath = new Path
        {
            Data = geometry,
            Fill = new SolidColorBrush(Colors.DarkGray),
            StrokeThickness = 4,
            Stroke = new SolidColorBrush(Colors.Gray)
        };
        LayoutRoot.Children.Add(ellipsePath);
        //
        var duplicateEllipsePath = new Path();
        //duplicateEllipsePath.Data = ellipsePath.Data; 
        duplicateEllipsePath.Data = geometry;
        duplicateEllipsePath.Fill = ellipsePath.Fill; 
        duplicateEllipsePath.StrokeThickness = ellipsePath.StrokeThickness;
        duplicateEllipsePath.Stroke = ellipsePath.Stroke;
        LayoutRoot.Children.Add(duplicateEllipsePath);
    }

最初の楕円である ellipsePath は問題なく、期待どおりにレンダリングされます。しかし、行duplicateEllipsePath.Data = ellipsePath.Dataまたは代替はduplicateEllipsePath.Data = geometryそれぞれ System.ArgumentException 「値が期待される範囲内にありません」をスローします。一度範囲内にいて、その後すぐに範囲外にするにはどうすればよいですか? このようなコードでパスを複製する正しい方法は何ですか?

4

1 に答える 1

3

パスを複製する唯一の方法は、手動で複製することです。Yi-Lun Luo からのこの回答を引用するには:

Data プロパティは、実際には Geometry です。Silverlight では目立ちませんが、A Geometry は実際には基盤となるシステム リソースに依存しています (何かを描画する必要があるため)。別のジオメトリを描画する必要がある場合は、別のシステム リソースが必要になります。そのため、新しいパスに割り当てる前に複製する必要があります。WPF には Geometry の Clone メソッドがありますが、残念ながらこれは Silverlight ではサポートされていません。したがって、手動でクローンを作成する必要があります。

ジオメトリのクローンを作成するリフレクション コードが含まれているという Yi-Lun の主張の上の別の投稿では、同じコードがここに表示されているようですが、後者はより明確にフォーマットされています。ただし、あなたの場合、このような方法を使用するのはやり過ぎのようです。MakeElipse使用するジオメトリは、 [sic] メソッドによって作成されます。ジオメトリを生成するための共通コードをメソッドに抽出することが、ここで進める最善の方法のようです。

「値が期待される範囲内にありません」というエラー メッセージは、誤解を招く可能性があります。まったく同じオブジェクトが最初の楕円の範囲内にあると思われるため、「範囲外」のものは何も表示されません。このエラー メッセージが報告される理由を正確に言うことはできませんが、推測することはできます。Silverlight はネイティブ コードで実装されています。ネイティブ コードは例外をスローできないため、代わりに数値エラー コードを返すと思います。おそらく、エラー コードの数が限られており、「値が期待される範囲内に収まらない」というエラー コードが、このエラーに対して選択されたものだったのでしょうか?

于 2012-09-15T15:57:29.363 に答える