2017-01-06 5 views
1

** Редактировать - я отметил ответ DynamicResource в качестве ответа для этого. Это решило проблему, которую я описал здесь. У меня все еще были проблемы с моим основным приложением, и оказалось, что это было потому, что я использовал кисть в другом месте как StaticResource, прежде чем использовать ее на моей границе как DynamicResource. Когда я переключил все на DynamicResource, он работал правильно. Благодаря!WPF ToggleButton Template BorderBrush

Я не могу заставить BorderBrush работать в шаблоном ToggleButton. Вот мой пример .xaml, если вы запустите это, вы увидите, что граница становится прозрачной при наведении указателя мыши или проверке одной из кнопок.

<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

Вы можете попробовать использовать WPF Inspector или Visual Studio 2015 для просмотра дерева Visual. Там вы можете увидеть, какие ресурсы применяются и из какого стиля. – Michael

+0

Я сделал это. Он просто говорит, что BorderBrush является «прозрачным», и он исходит из триггера стиля. – MadSkeletor

+0

Вы можете попытаться установить установщик BorderBrush на определенное значение вместо ссылки на статический ресурс. Просто посмотреть, работает ли это. – Michael

ответ

0

Поскольку свойство цветой кисти устанавливается с помощью расширения разметки Dynamic ресурсов вы также должны установить свойство в вашем инкубаторе с помощью Dynamic Ресурса:

<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> 

я использовать StaticResource значение сеттеров не будет обновляться после того, как цветные ресурсы действительно были просмотрены во время выполнения.

+0

Это работает также с «границей». Все еще странно, что другой подход работает с «Прямоугольником» и что он работает с комбинацией StaticResource и DynamicResource для чего угодно, кроме BorderBrush. – Michael

+0

** edit, мой плохой, у меня просто было неправильное имя. Он также работает с ресурсным словарем – MadSkeletor

1

Используя Rectangle, кажется, работает. Взгляните на это: DynamicResource color doesn't work for BorderBrush on a Border - Bug?. Не имеет для меня никакого смысла, что это не должно работать.

<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> 
Смежные вопросы