1

各行のオブジェクトタイプなどを示すアイコンを含む、データオブジェクトを行にレンダリングするツリービューを使用するGUIがあります。各行にアイコンファイルを追加すると、読み込みが遅くなり、レンダリングが多くなることに気付いたので、アイコンを図面として書き直すことを考えています。概念実証を1つ行い、次のアイコンを模倣しました

<Border Width="15" Height="15" BorderThickness="0" CornerRadius="4,4,4,4" Background="#22bb22" VerticalAlignment="Center">
            <Path StrokeThickness="1.5" Stroke="#FFFFFFFF" Data="M 2,4 C 2,4 10,4 9,12 M 2,7 C 2,7 7,7 6,12 M 2,10.5 L 4,10.5"/>
        </Border>

ただし、これを静的リソースとしてXAMLに含める方法がわかりません。この図面を一度ロードして、毎回再描画せずにアプリケーション全体で再利用したいと思います。私は画像で同様のことを行い、リソースディクショナリを作成し、StaticResourceExtensionクラスを使用して、そのディクショナリのキーを介してキャッシュ内の画像を検索し、それを画像タグのソースにバインドしました。例えば

<Image Source="{y:ImageStaticResource {Binding IconString}}" Margin="0,0,0,0"></Image>

ImageStaticResourceは私のカスタムクラスであり、datacontextのIconStringプロパティは、画像の場所の文字列を返す辞書で検索するキーです。これはうまく機能し、非常にうまく機能します。しかし、私はこれらの図面と同様のことをしたいのですが、その方法を完全に理解することはできません。まったく同じことを実行するが、異なるリソースディクショナリをロードする新しい静的リソース拡張機能を作成しました。最初のエントリは次のとおりです。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"                     
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

        <Border x:Key="Default" Width="15" Height="15" BorderThickness="0"></Border>

        <Border x:Key="..\Resources\Images\AccountOnly.ico" Width="15" Height="15" BorderThickness="0" CornerRadius="4,4,4,4" Background="#22bb22" VerticalAlignment="Center">
            <Path StrokeThickness="1.5" Stroke="#FFFFFFFF" Data="M 2,4 C 2,4 10,4 9,12 M 2,7 C 2,7 7,7 6,12 M 2,10.5 L 4,10.5"/>
        </Border>

    </ResourceDictionary>

だから私はこの境界線のある図面をキーで調べたいと思っています(すべてのアイコンは図面を囲む境界線で表すことができますが、何をすべきか理解できません。誰か提案を提供できますか?

4

2 に答える 2

0

リソースにある境界線をビジュアルツリーのどこかに「配置」するには、ContentControlまたはContentPresenterを使用して、キー付きリソースを参照します。

<ContentControl Content="{StaticResource Default}"/>

また

<ContentControl Content="{StaticResource ..\Resources\Images\AccountOnly.ico}"/>

(2番目の境界線で使用したキー名は少し型破りであることに注意してください)

ただし、Borderを複数回使用しようとすると、「指定された要素はすでに別の要素の論理的な子である」という問題が発生します。

リソースをx:Shared="False"でマークして、参照ごとに新しいインスタンスが作成されるようにすることができます...しかし、その後、正方形に戻る可能性があります。つまり、レンダリングが非効率的です。

FrameworkElementまたは、「アイコン」のレンダリングに必要な最小限の処理を実行し、共有データを最適化するように特別に調整された独自の派生クラスを作成することを検討することもできます。

テンプレートの柔軟性が必要ない場合は、可能であれば、より重い「コントロール」派生クラスを避けてください。

于 2012-10-25T11:43:14.187 に答える
0

リソースとして定義されているDrawingBrushをRectangleコントロールに入力することで、同じ視覚的な結果を得ることができます。

<Window.Resources>
    <DrawingBrush x:Key="SomeIcon" Stretch="None">
        <DrawingBrush.Drawing>
            <DrawingGroup>
                <GeometryDrawing Brush="#22bb22">
                    <GeometryDrawing.Geometry>
                        <RectangleGeometry Rect="0,0,15,15" RadiusX="4" RadiusY="4"/>
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
                <GeometryDrawing Geometry="M 2,4 C 2,4 10,4 9,12 M 2,7 C 2,7 7,7 6,12 M 2,10.5 L 4,10.5">
                    <GeometryDrawing.Pen>
                        <Pen Brush="#FFFFFFFF" Thickness="1.5"/>
                    </GeometryDrawing.Pen>
                </GeometryDrawing>
            </DrawingGroup>
        </DrawingBrush.Drawing>
    </DrawingBrush>
</Window.Resources>

...

<Rectangle Width="15" Height="15" Fill="{StaticResource SomeIcon}"/>
于 2012-10-25T12:45:34.480 に答える