2017-01-06 3 views
1

** Modifier - J'ai marqué la réponse DynamicResource comme réponse pour cela. Cela a résolu le problème que j'ai décrit ici. J'avais toujours des problèmes avec mon application principale et il s'est avéré que c'était parce que j'utilisais le pinceau ailleurs comme source statique avant de l'utiliser sur ma frontière en tant que DynamicResource. Quand j'ai tout changé à DynamicResource cela a fonctionné correctement. Merci!WPF ToggleButton Template BorderBrush

Je n'arrive pas à faire fonctionner le BorderBrush dans un ToggleButton basé sur un modèle. Voici mon exemple .xaml, si vous exécutez ceci, vous verrez que la bordure devient transparente lorsque vous passez la souris ou que vous cochez l'un des boutons.

<Window x:Class="ToggleButtonStyle.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:ToggleButtonStyle" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <!-- <ResourceDictionary Source="Dictionary1.xaml" /> --> 
    <!-- main color of buttons--> 
    <Color x:Key="MainThemeColor">Orange</Color> 

    <!-- hover-over color for buttons --> 
    <Color x:Key="MouseOverColor">Purple</Color> 

    <!-- 5. Mouse over background color for step buttons --> 
    <SolidColorBrush x:Key="MouseOverBackgroundBrush" Color="{DynamicResource MouseOverColor}"/> 

    <!-- 6. Background color active step --> 
    <SolidColorBrush x:Key="CheckedBackgroundBrush" Color="{DynamicResource MainThemeColor}"/> 

    <Style TargetType="{x:Type ToggleButton}" x:Key="ToggleButtonStyle"> 
     <Setter Property="Background" Value="White" /> 
     <Setter Property="Foreground" Value="Black" /> 
     <Setter Property="Width" Value="Auto"/> 
     <Setter Property="Height" Value="40"/> 
     <Setter Property="FontSize" Value="13"/> 
     <Setter Property="MinWidth" Value="80"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ToggleButton}"> 
        <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness ="{TemplateBinding BorderThickness}" Padding="5" Margin="2"> 
         <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="BorderBrush" Value="{StaticResource CheckedBackgroundBrush}" /> 
       <Setter Property="Background" Value="{StaticResource MouseOverBackgroundBrush}" /> 
       <Setter Property="Foreground" Value="#333333" /> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="BorderBrush" Value="{StaticResource MouseOverBackgroundBrush}"/> 
       <Setter Property="Background" Value="{StaticResource CheckedBackgroundBrush}" /> 
       <Setter Property="Foreground" Value="#ffffff"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <StackPanel Orientation="Horizontal"> 
     <ToggleButton Style="{DynamicResource ToggleButtonStyle}">Button 1</ToggleButton> 
     <ToggleButton Style="{DynamicResource ToggleButtonStyle}">Button 2</ToggleButton> 
     <ToggleButton Style="{DynamicResource ToggleButtonStyle}">Button 3</ToggleButton> 
    </StackPanel> 
</Grid> 

+0

Vous pouvez essayer d'utiliser WPF Inspector ou Visual Studio 2015 pour regarder l'arborescence Visual. Là, vous pouvez voir quelles ressources sont appliquées et de quel style. – Michael

+0

Je l'ai fait. Il dit simplement que BorderBrush est "Transparent" et qu'il provient d'un trigger de style. – MadSkeletor

+0

Vous pouvez essayer de définir l'accesseur BorderBrush sur une valeur spécifique au lieu de référencer une ressource statique. Juste pour voir si cela fonctionne. – Michael

Répondre

0

Depuis la propriété Couleur des brosses sont définies en utilisant l'extension de balisage des ressources dynamique vous devez également définir les propriétés de votre setter à l'aide dynamique ressource:

<Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="BorderBrush" Value="{DynamicResource CheckedBackgroundBrush}" /> 
     <Setter Property="Background" Value="{DynamicResource MouseOverBackgroundBrush}" /> 
     <Setter Property="Foreground" Value="#333333" /> 
    </Trigger> 
    <Trigger Property="IsChecked" Value="True"> 
     <Setter Property="BorderBrush" Value="{DynamicResource MouseOverBackgroundBrush}"/> 
     <Setter Property="Background" Value="{DynamicResource CheckedBackgroundBrush}" /> 
     <Setter Property="Foreground" Value="#ffffff"/> 
    </Trigger> 
</Style.Triggers> 

Je vous utilise StaticResource la valeur des setters ne sera pas mise à jour une fois que les ressources colorimétriques dynamiques auront effectivement été recherchées au moment de l'exécution.

+0

Cela fonctionne aussi bien avec un 'Border'. Encore étrange que l'autre approche fonctionne avec un 'Rectangle' et que cela fonctionne avec une combinaison de StaticResource et DynamicResource pour tout autre chose que BorderBrush. – Michael

+0

** edit, mon mauvais, je viens d'avoir un mauvais nom. Il fonctionne aussi avec le dictionnaire de ressources – MadSkeletor

1

L'utilisation d'un rectangle semble fonctionner. Jetez un coup d'oeil à ceci: DynamicResource color doesn't work for BorderBrush on a Border - Bug?. Ça n'a aucun sens pour moi que ça ne marche pas.

<Style TargetType="{x:Type ToggleButton}"> 
     <Setter Property="Background" Value="White" /> 
     <Setter Property="Foreground" Value="Black" /> 
     <Setter Property="BorderBrush" Value="{DynamicResource MouseOverBackgroundBrush}"/> 
     <Setter Property="Width" Value="Auto"/> 
     <Setter Property="Height" Value="40"/> 
     <Setter Property="FontSize" Value="13"/> 
     <Setter Property="MinWidth" Value="80"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ToggleButton}"> 
        <Grid> 
         <Rectangle Fill="{TemplateBinding Background}" 
            Stroke="{TemplateBinding BorderBrush}" 
            StrokeThickness="{TemplateBinding BorderThickness}" 
            Margin="2"> 
         </Rectangle> 
         <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="BorderBrush" Value="{StaticResource CheckedBackgroundBrush}" /> 
       <Setter Property="Background" Value="{StaticResource MouseOverBackgroundBrush}" /> 
       <Setter Property="Foreground" Value="#333333" /> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="BorderBrush" Value="{StaticResource MouseOverBackgroundBrush}"/> 
       <Setter Property="Background" Value="{StaticResource CheckedBackgroundBrush}" /> 
       <Setter Property="Foreground" Value="#ffffff"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style>