如何使用DrawingBrush作为窗口图标

本文关键字:窗口 图标 何使用 DrawingBrush | 更新日期: 2023-09-27 18:01:41

我有一个包含XAML图像的ResourceDictionary的DLL:

<DrawingBrush x:Key="imgFoo" ViewboxUnits="Absolute" Viewbox="0,0,128,128">
    <DrawingBrush.Drawing>
        <GeometryDrawing Brush="#FF111111">
            <GeometryDrawing.Pen>
                <Pen LineJoin="Miter" StartLineCap="Square" EndLineCap="Square"/>
            </GeometryDrawing.Pen>
            <GeometryDrawing.Geometry>
                <PathGeometry Figures="M 56.5625 ... 64.03125 45.46875 z" 
                              FillRule="NonZero"/>
            </GeometryDrawing.Geometry>
        </GeometryDrawing>
    </DrawingBrush.Drawing>
</DrawingBrush>

是否可以将DrawingBrush用作Window.Icon ?

使用StaticResourceDynamicResource不工作:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Icon="{DynamicResource imgFoo}">

我发现唯一的事情是使用窗口。像这样的资源:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Icon="{DynamicResource imgFoo}">
    <Window.Resources>
        <DrawingImage x:Key="imgFoo">
            <DrawingImage.Drawing>
                <GeometryDrawing Brush="#FF111111">
                    <GeometryDrawing.Pen>
                        <Pen LineJoin="Miter" StartLineCap="Square" 
                             EndLineCap="Square"/>
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Geometry>
                        <PathGeometry Figures="M 56.5625 ... 64.03125 45.46875 z" 
                                      FillRule="NonZero"/>
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
            </DrawingImage.Drawing>
       </DrawingImage>
  </Window.Resources>

但是这只使用了DLL文件中DrawingBrush的一部分,并创建了重复的XAML代码。

关于如何直接使用DrawingBrush有什么建议吗?

如何使用DrawingBrush作为窗口图标

你可以将资源声明分成两部分,分别声明GeometryDrawing和DrawingBrush:

<GeometryDrawing x:Key="imgFooDrawing" Brush="#FF111111">
    <GeometryDrawing.Pen>
        <Pen LineJoin="Miter" StartLineCap="Square" EndLineCap="Square"/>
    </GeometryDrawing.Pen>
    <GeometryDrawing.Geometry>
        <PathGeometry Figures="M10,64 L64,10 118,64 64,118Z" FillRule="NonZero"/>
    </GeometryDrawing.Geometry>
</GeometryDrawing>
<DrawingBrush x:Key="imgFoo" ViewboxUnits="Absolute" Viewbox="0,0,128,128"
              Drawing="{StaticResource imgFooDrawing}">
</DrawingBrush>

现在你可以直接在DrawingImage中重用GeometryDrawing作为窗口的图标:

<Window.Icon>
    <DrawingImage Drawing="{DynamicResource imgFooDrawing}"/>
</Window.Icon>

如果你不能改变资源DLL,你可以将DrawingImage的Drawing属性绑定到DrawingBrush的Drawing属性。

然而,这需要一个丑陋的解决方案,因为你不能使用DynamicResource作为绑定源。你可以将窗口的Tag属性设置为DrawingBrush,然后创建一个RelativeSource/FindAncestor绑定:
<Window ... Tag="{DynamicResource imgFoo}">
    <Window.Icon>
        <DrawingImage Drawing="{Binding Tag.Drawing,
            RelativeSource={RelativeSource AncestorType=Window}}"/>
    </Window.Icon>
</Window>