下午好!
我控制了。有代码:
public class ShutterWidget : Control
{ // this Control changes own Background property (changes brush) in some time }
和ResourceDictionary的风格:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:widgets="clr-namespace:ProcessControl.Widgets">
<DrawingBrush x:Key="ShutterBrush" x:Shared ="true" Stretch="Uniform">
<DrawingBrush.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}" Geometry="F1M84.7698,0.8018L84.7698,36.1568 106.761,14.2929 106.761,0.8018 84.7698,0.8018z"/>
<GeometryDrawing Geometry="F1M84.7698,0.8018L84.7698,36.1568 106.761,14.2929 106.761,0.8018 84.7698,0.8018z">
<GeometryDrawing.Pen>
<Pen Brush="Black" EndLineCap="Round" LineJoin="Round" StartLineCap="Round" Thickness="1.6036"/>
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
<Style TargetType="widgets:ShutterWidget">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="widgets:ShutterWidget">
<Rectangle Fill="{StaticResource ShutterBrush}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
此词典包含用于显示此Control的模板。此模板使用DrawingBrush。
我想通过更改ShutterWidget的背景属性来更改DrawingBrush的部分填充。
更新:
我走了另一条道路,因为在我看来,改变部分DrawingBrush很难。我决定在另一个上改变整个DrawingBrush。但现在我又遇到了一个问题。 我创建了不同的ResourceDictionary,每个包含一个DrawingBrush。从后面的代码我使用XamlReader.Load加载它们。但是XamlReader会抛出异常&#34;无法创建&#34; ImageSource&#34;基于文本&#34; valve_off_files / image0.png&#34;。目录&#34; valve_off_files&#34;包括额外的png文件(我使用ExpressionDesign从emf文件获取ResourceDictionary。它创建了xaml文件和带有额外图像文件的额外目录。)。当我加载XamlReader时,没有找到在DrawingBrush中使用的额外文件image0.png。 为什么XamlReader没有看到这个文件image0.png?
以下是ResourceDictionary的一部分代码,它创建了ExpressionDesign。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DrawingBrush x:Key="valve_off" Stretch="Uniform">
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<ImageDrawing ImageSource="valve_off_files/image0.png" Rect="0,0,88,96"/>
</DrawingGroup.Children>
所以我加载了xaml文件:
public static Brush GetItem(string name)
{
using (var str = new FileStream($"Resources/{name}.xaml", FileMode.Open))
{
var dct = (ResourceDictionary)XamlReader.Load(str);
return (Brush)dct?[name];
}
}
更新2:
我找到了解决方案。我帮助使用了接受ParserContext的其他XamlReader方法。 XamlReader.Load(FileStream,ParserContext)。在我设置ParserContext的BaseUri属性后,XamlReader正确读取了xaml文件。
非常感谢所有试图帮助我的人。