2017-05-12 5 views
0

Ich habe eine Button-Vorlage erstellt. Es gibt ein Bild und ein Label. Die Quelle des Bildes ist in einem ResourceDictionary Bilder. Die Quelle des Bildes ist ein DrawingImage mit weißer Pinselfarbe.Ändern der Farbe des GeometryDrawing Brush beim Drücken der Taste

<DrawingImage x:Key="Moduly"> 
    <DrawingImage.Drawing> 
    <DrawingGroup> 
     <GeometryDrawing Brush="{Binding BackgroundColor}" Geometry="M 0,0L 32,0L 32,32L 0,32L 0,0 Z " /> 
     <GeometryDrawing Brush="{Binding IconColor}" Geometry="M800.336 949.171H184.527c-80.603 0-136.768-65.56-136.768-146.159V203.677 c0-80.602 56.166-152.42 136.768-152.42h615.809c80.598 0 149.289 71.818 149.289 152.42v599.334 C949.625 883.611 880.934 949.171 800.336 949.171L800.336 949.171z M874.488 203.677c0-39.184-34.99-77.287-74.152-77.287H184.527 c-39.166 0-61.632 38.103-61.632 77.287v599.334c0 39.182 22.466 71.024 61.632 71.024h615.809 c39.162 0 74.152-31.843 74.152-71.024V203.677L874.488 203.677z M273.604 613.832h447.829v75.134H273.604V613.832L273.604 613.832z M273.604 463.566h447.829v75.131H273.604V463.566L273.604 463.566z M273.604 313.295h447.829v75.134H273.604V313.295 L273.604 313.295z" />     
    </DrawingGroup> 
    </DrawingImage.Drawing>  
</DrawingImage> 

Die Quelle aller Arten (Button, Stackpanel, Label) ist in Stile Ressourcenverzeichnis.

Ich muss die Pinselfarbe der DrawingImage ändern, wenn die Taste gedrückt wird. Nur das bestimmte Bild innerhalb der gedrückten Taste.

<Button Grid.Column="0" Grid.Row="2" Name="modulyButton" 
     HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
     BorderThickness="3" Margin="0,0,0,0"> 
    <StackPanel Orientation="Vertical" Name="modulyStackPanel" 
       HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <Image x:Name="modulyImage" Source="{StaticResource Moduly}" 
      HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      Height="30" Width="30"/> 
    <Label x:Name="modulyLabel" Content="MODULY" 
      VerticalAlignment="Center"/> 
    </StackPanel> 
</Button> 

Hat jemand eine Lösung?

+0

Was haben Sie bisher versucht? –

+0

Ich versuche create image style trigger. Aber es gibt ein Problem. Bild hat keine Farbspezifikation. –

+0

Meine nächste Idee war es, Zeichnungsimage Trigger direkt im Ressourcenverzeichnis Bilder zu erstellen. Vorfahren verwenden Aber ich weiß nicht, ob das wirklich möglich ist. –

Antwort

0

Ich denke, es gibt keine Möglichkeit, mit der Struktur, die Sie erstellt haben. Bei der Kompilierung der Image der Button weiß nur, dass ein StaticResource den richtigen Typ hat seine Source Eigenschaft zugewiesen worden, aber es weiß nicht, dass die Source Instanz ein DrawingGroup mit 2 Elementen aufweist, die eine Brush Eigenschaft hat, und so gibt ist keine Möglichkeit, diese Brush Eigenschaft in der Image.Triggers zu nennen. Sie müssen die ganze ersetzen.

Meine Lösung (in vereinfachter Form, mit Grün/Rot Farbe wechseln):

1) Erstellen Sie zwei DrawingImage, mit den gleichen Geometry aber unterschiedlichen Brush:

<DrawingImage x:Key="Moduly1"> 
    <DrawingImage.Drawing> 
    <DrawingGroup> 
     <GeometryDrawing Brush="Green" Geometry="M 0,0L 32,0L 32,32L 0,32L 0,0 Z" /> 
    </DrawingGroup> 
    </DrawingImage.Drawing> 
</DrawingImage> 

<DrawingImage x:Key="Moduly2"> 
    <DrawingImage.Drawing> 
    <DrawingGroup> 
     <GeometryDrawing Brush="Red" Geometry="M 0,0L 32,0L 32,32L 0,32L 0,0 Z" /> 
    </DrawingGroup> 
    </DrawingImage.Drawing> 
</DrawingImage> 

2) Im ButtonTemplate (im ResourceDictionary) schreibt dies auf dem inneren StackPanel Stil:

<Style TargetType="StackPanel"> 
    <Style.Resources> 
    <Style TargetType="Label"> 
     <Setter Property="Foreground" Value="White" /> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsPressed, 
         RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" 
        Value="True"> 
      <Setter Property="Foreground" Value="#103255" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    <!-- ADDED PART --> 
    <Style TargetType="Image"> 
     <Setter Property="Source" Value="{StaticResource ResourceKey=Moduly1}"/> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsPressed, 
         RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" 
        Value="True"> 
      <Setter Property="Source" Value="{StaticResource ResourceKey=Moduly2}" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    <!-- END ADDED PART --> 
    </Style.Resources> 
</Style> 

3) Entfernen Sie in Ihrem speziellen Fall Button die Source-Eigenschaft aus dem Element Image.

+0

Danke. Ich versuche deine Lösung und es funktioniert! Aber ich habe mehr als einen Knopf. Ich brauche eine allgemeinere Lösung. Vielleicht sollte ich Image durch ViewBox ersetzen? In einem Beispiel habe ich gesehen, dass es möglich ist, Path mit Binding Color und Source zu füllen. –

+0

Ich denke, Sie wollen viele Schaltflächen alle mit der gleichen Vorlage (ein Label und ein Bild, mit diesem Stil, Layout, Ränder, etc), und Sie möchten nur den Label Text und die Bildquelle von Button zu Button (und die Befehl an den Button gebunden). Wenn Sie das xaml des Templates nicht jedes Mal wiederholen wollen, würde ich Ihnen vorschlagen, ein UserControl mit dem Code des Buttons und mit [DependencyProperty] (https://msdn.microsoft.com/de-de) zu erstellen/library/ms752914) (wie "TextProperty" und "ImageSourceProperty" oder was auch immer) und bindet diese an die Eigenschaften der internen Komponenten des UC –

Verwandte Themen