WPF。如何绑定到ControlTemplate的属性?

时间:2017-03-29 14:45:55

标签: c# wpf data-binding

下午好!

我控制了。有代码:

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文件。

非常感谢所有试图帮助我的人。

0 个答案:

没有答案