首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DrawingBrush中重新映射颜色?

如何在DrawingBrush中重新映射颜色?
EN

Stack Overflow用户
提问于 2012-03-27 09:35:34
回答 2查看 2.2K关注 0票数 5

假设我有一个DrawingBrush,它有三种硬编码颜色,即边框、前景和背景。

代码语言:javascript
复制
<!-- Resource -->
<DrawingBrush x:Key="EventIcon" Stretch="Uniform">
    <DrawingBrush.Drawing>
        <DrawingGroup>
            <DrawingGroup.Children>
                <GeometryDrawing Brush="#FF9200CE" Geometry="F1 M 51.2119,61.4688L 43.4193,61.4688L 43.4194,29.318L 27.8341,29.318L 27.834,61.4688L 20.0414,61.4688L 35.6267,77.1353L 51.2119,61.4688 Z "/>
                <GeometryDrawing Brush="#FFB400FF" Geometry="F1 M 44.4789,64.2014L 40.2667,64.2667L 40.13,29.318L 27.8341,29.318L 27.834,61.4688L 20.0414,61.4688L 33.8667,75.1467L 44.4789,64.2014 Z "/>
                <GeometryDrawing Geometry="F1 M 51.2119,61.4688L 43.4193,61.4688L 43.4194,29.318L 27.8341,29.318L 27.834,61.4688L 20.0414,61.4688L 35.6267,77.1353L 51.2119,61.4688 Z ">
                    <GeometryDrawing.Pen>
                        <Pen Thickness="2" StartLineCap="Round" EndLineCap="Round" LineJoin="Round" Brush="#FF3D0033"/>
                    </GeometryDrawing.Pen>
                </GeometryDrawing>
                <GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M 33.7559,53.2538L 32.6202,40.9989L 32.6202,35.3362L 37.3531,35.3362L 37.3531,40.9989L 36.2333,53.2538L 33.7559,53.2538 Z M 32.6202,59.6771L 32.6202,54.9442L 37.3531,54.9442L 37.3531,59.6771L 32.6202,59.6771 Z "/>
            </DrawingGroup.Children>
        </DrawingGroup>
    </DrawingBrush.Drawing>
</DrawingBrush>

<!-- Usage -->
<Rectangle Width="16" Height="16" Fill="{StaticResource EventIcon}" />

问题

什么是最好的方法,能够改变这些颜色从父Rectangle,但仍然有一个默认的退路?

当我写这个问题的时候,我想到了两种可能的解决方案.

可能的解决方案#1

但是,使用RelativeSource绑定将每个绑定连接到它们的等效属性,例如{Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:type Rectangle}}

  1. Rectangle是一个Shape,不具有BorderBrush属性;
  2. 我无法提供默认值。在绑定中指定FallbackValue将不能工作,因为绑定将解析并接受它的默认值。(编辑:,当我写这篇文章时,我想我可以使用NullValue属性)。

可能的解决方案#2

编写一个附加属性,该属性接受颜色/画笔数组,然后有一个转换器将其映射到GeometryDrawing.Brush。使用Binding.IsNull属性提供一个默认值,因为如果附加属性为null或该颜色未被重新映射,则它将返回空值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-27 10:08:07

我将使用动态资源引用,在应用程序级别(Application.Resources)定义默认值,并通过在某些控件的资源中添加具有相同键的画笔在本地更改它们。

票数 3
EN

Stack Overflow用户

发布于 2012-03-27 10:04:58

您可以为这三种颜色中的每一种创建附加属性,然后创建默认样式,为它们提供默认值。

然后,如果需要使用普通附加属性语法,则可以在Rectangle声明中覆盖这些值。

我能想到的唯一其他方法是将颜色作为静态资源,如果您想重写,可以在Rectangle的资源字典中重新创建这些颜色。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9886869

复制
相关文章

相似问题

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