1

我有一个使用树视图的 GUI,它将数据对象呈现为行,包括用于表示每行的对象类型等的图标。我注意到将图标文件添加到每一行会减慢负载并渲染很多,所以我玩弄将图标重写为绘图的想法。我已经完成了一个概念验证并模仿了一个带有以下内容的图标

<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}"/>

(注意你在第二个边框上使用的键名有点不合常规)

但是,一旦您尝试多次使用边框,即“指定的元素已经是另一个元素的逻辑子元素”,就会遇到问题。

您可以用 标记资源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 回答