3
votes

UPDATE: This is since I installed VS2012 RC. (Duh, sorry should have said). I have a WPF Toggle Button. I want to draw a picture on it, so I made a Drawing Brush, I want to control the color of the drawing, so I bound it to the ToggleButton's Foreground property. Don't seem to work though? (in the following example, the drawing is meant to be blue, but it's black).

<UserControl x:Class="SynthEditWpf.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
        <UserControl.Resources>

        <DrawingBrush x:Key="Power" Stretch="None">
            <DrawingBrush.Drawing>
                <DrawingGroup>
                    <DrawingGroup.Children>
                        <GeometryDrawing Geometry="F1 M 11.9999,4.34296L 11.9999,9.57471">
                            <GeometryDrawing.Pen>
                                <Pen Thickness="3" StartLineCap="Round" EndLineCap="Round" LineJoin="Round" Brush="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Control}}}"/>
                            </GeometryDrawing.Pen>
                        </GeometryDrawing>
                        <GeometryDrawing Geometry="F1 M 7.60373,6.78986C 6.09436,8.03101 5.13317,9.90375 5.13317,11.999C 5.13317,15.7359 8.19123,18.7654 11.9635,18.7654C 15.7359,18.7654 18.7939,15.7359 18.7939,11.999C 18.7939,9.90375 17.8327,8.03101 16.3234,6.78986">
                            <GeometryDrawing.Pen>
                                <Pen Thickness="3" StartLineCap="Round" EndLineCap="Round" LineJoin="Round" Brush="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Control}}}"/>
                            </GeometryDrawing.Pen>
                        </GeometryDrawing>
                    </DrawingGroup.Children>
                </DrawingGroup>
            </DrawingBrush.Drawing>
        </DrawingBrush>
    </UserControl.Resources>
    <Grid>
        <ToggleButton Foreground="Blue" Width="30" Height="30">
            <Rectangle Fill="{StaticResource Power}" Width="24" Height="24" />
        </ToggleButton>
    </Grid>
</UserControl>

TRACE OUTPUT

System.Windows.Data Warning: 55 : Created BindingExpression (hash=9381496) for Binding (hash=30868550) System.Windows.Data Warning: 57 : Path: 'Foreground' System.Windows.Data Warning: 59 : BindingExpression (hash=9381496): Default mode resolved to OneWay System.Windows.Data Warning: 60 : BindingExpression (hash=9381496): Default update trigger resolved to PropertyChanged System.Windows.Data Warning: 61 : BindingExpression (hash=9381496): Attach to System.Windows.Media.Pen.Brush (hash=13172414) System.Windows.Data Warning: 65 : BindingExpression (hash=9381496): RelativeSource (FindAncestor) requires tree context System.Windows.Data Warning: 64 : BindingExpression (hash=9381496): Resolve source deferred

1
Show me your binding errors. Also i hope you are talking run-time here, if not you better rectify that.H.B.
Can you try setting the foreground in the DrawingBrush resources?TMan
no binding errors in the console window. Don't work in designer, don't work at runtime.Jeff McClintock
Sorry don't understand "setting foreground in the Drawingbrush resources?" DrawingBrush and DrawingGroup don't have that property. I can directly set the Pen's Brush to say "Red" - no problem. But binding is the issue.Jeff McClintock
(added trace output to question).Jeff McClintock

1 Answers

7
votes

This works for me. Ok, i better explain that hey. When it is just a brush as a resource it is not part of the rectangle. The ancestor it is finding is actually the userControl. Try changing the foreground of the user control and you will see it change the colour of your pen. To get it as part of the rectangle and therefore the togglebutton you need to wrap it in a style (see below)

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">   
    <Window.Resources>

    <Style x:Key="Frank" TargetType="Rectangle">
        <Style.Resources>
            <DrawingBrush x:Key="Power" Stretch="None">
                <DrawingBrush.Drawing>
                    <DrawingGroup>
                        <DrawingGroup.Children>
                            <GeometryDrawing Geometry="F1 M 11.9999,4.34296L 11.9999,9.57471">
                                <GeometryDrawing.Pen>
                                    <Pen Thickness="3" StartLineCap="Round" EndLineCap="Round" LineJoin="Round" Brush="{Binding RelativeSource={RelativeSource AncestorType=ToggleButton, Mode=FindAncestor}, Path=Foreground}"/>
                                </GeometryDrawing.Pen>
                            </GeometryDrawing>
                            <GeometryDrawing Geometry="F1 M 7.60373,6.78986C 6.09436,8.03101 5.13317,9.90375 5.13317,11.999C 5.13317,15.7359 8.19123,18.7654 11.9635,18.7654C 15.7359,18.7654 18.7939,15.7359 18.7939,11.999C 18.7939,9.90375 17.8327,8.03101 16.3234,6.78986">
                                <GeometryDrawing.Pen>
                                    <Pen Thickness="3" StartLineCap="Round" EndLineCap="Round" LineJoin="Round" Brush="{Binding RelativeSource={RelativeSource AncestorType=ToggleButton, Mode=FindAncestor}, Path=Foreground}"/>
                                </GeometryDrawing.Pen>
                            </GeometryDrawing>
                        </DrawingGroup.Children>
                    </DrawingGroup>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </Style.Resources>
        <Setter Property="Fill" Value="{StaticResource Power}"/>
    </Style>
</Window.Resources>
    <Grid>
        <ToggleButton Foreground="Blue" Width="30" Height="30">
            <Rectangle Style="{StaticResource Frank}" Width="24" Height="24"  />
        </ToggleButton>
    </Grid>