首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DrawingBrush作为Window.Icon?

如何使用DrawingBrush作为Window.Icon?
EN

Stack Overflow用户
提问于 2015-07-08 12:53:35
回答 1查看 1.5K关注 0票数 2

我有一个DLL,它的ResourceDictionary包含一个XAML映像:

代码语言:javascript
复制
<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不起作用:

代码语言:javascript
复制
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Icon="{DynamicResource imgFoo}">

我发现的唯一一件事就是像这样使用Window.Resources:

代码语言:javascript
复制
<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,有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-08 14:42:58

您可以将资源声明分为两部分,并分别声明GeometryDrawing和DrawingBrush:

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<Window.Icon>
    <DrawingImage Drawing="{DynamicResource imgFooDrawing}"/>
</Window.Icon>

如果无法更改资源DLL,则可以将DrawingImage的绘图属性绑定到DrawingBrush的绘图属性。

但是,这需要一个难看的解决办法,因为您不能使用DynamicResource作为绑定源。您可以将窗口的标记属性设置为DrawingBrush,然后创建RelativeSource/FindAncestor绑定:

代码语言:javascript
复制
<Window ... Tag="{DynamicResource imgFoo}">
    <Window.Icon>
        <DrawingImage Drawing="{Binding Tag.Drawing,
            RelativeSource={RelativeSource AncestorType=Window}}"/>
    </Window.Icon>
</Window>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31293339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档