2017-06-07 23 views
2

我已经定制使用的ControlTemplate像这样切换按钮控件:更改样式控件中的控件模板的一部分?

<StackPanel> 
    <StackPanel.Resources> 
     <Style x:Key="OptionBarButton" TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ToggleButton"> 
         <Border Padding="18,12,18,12" Background="{TemplateBinding Background}"> 
          <ContentPresenter /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsChecked" Value="True" /> 
            <Condition Property="IsMouseOver" Value="True" /> 
           </MultiTrigger.Conditions> 
           <MultiTrigger.Setters> 
            <Setter Property="Background" Value="DarkBlue" /> 
           </MultiTrigger.Setters> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsChecked" Value="True" /> 
            <Condition Property="IsMouseOver" Value="False" /> 
           </MultiTrigger.Conditions> 
           <MultiTrigger.Setters> 
            <Setter Property="Background" Value="SkyBlue" /> 
           </MultiTrigger.Setters> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsChecked" Value="False" /> 
            <Condition Property="IsMouseOver" Value="False" /> 
           </MultiTrigger.Conditions> 
           <MultiTrigger.Setters> 
            <Setter Property="Background" Value="#88000000" /> 
           </MultiTrigger.Setters> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsChecked" Value="False" /> 
            <Condition Property="IsMouseOver" Value="True" /> 
           </MultiTrigger.Conditions> 
           <MultiTrigger.Setters> 
            <Setter Property="Background" Value="#F0000000" /> 
           </MultiTrigger.Setters> 
          </MultiTrigger> 
         </ControlTemplate.Triggers> 

        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </StackPanel.Resources> 

    <ToggleButton Style="{StaticResource OptionBarButton}"> 
     <Image Source="../Assets/icons/action.png" Height="26" RenderOptions.BitmapScalingMode="Fant" /> 
    </ToggleButton> 

    <ToggleButton Style="{StaticResource OptionBarButton}"> 
     <Image Source="../Assets/icons/action2.png" Height="26" RenderOptions.BitmapScalingMode="Fant" /> 
    </ToggleButton> 

</StackPanel> 

这工作得很好,但是我现在要更改模板的某些部分在一些风格的控制,即器isChecked颜色状态的(天蓝色/ DarkBlue)。

在使用它时,是否可以修改/传递模板中的这些颜色?我知道我可以使用附加属性或/和子类的ToggleButton类(添加依赖属性),但我想知道是否没有更通俗的方式来解决这个问题,也许只能用xaml。使用C#编写自定义代码似乎对于这样一个简单的用例有点矫枉过正?

回答

3

据我所知,没有简单的方法可以做到这一点,但如果你真的想 - 你可以以某种方式利用动态资源。通常动态资源用于在运行时改变所有控件实例的出现。您从模板引用动态资源,然后更改该资源,并且所有控件都反映此更改。在这种情况下,这可能不是您所需要的,因为您想更改“某些样式化控件中模板的某些部分”。你仍然可以这样做:

<!-- default checked and over color --> 
<SolidColorBrush x:Key="TgCheckedAndOver" Color="DarkBlue" /> 
<!-- default checked color --> 
<SolidColorBrush x:Key="TgChecked" Color="SkyBlue" /> 
<Style 
     TargetType="{x:Type ToggleButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ToggleButton"> 
       <Border Padding="18,12,18,12" 
         Background="{TemplateBinding Background}"> 
        <ContentPresenter /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsChecked" 
             Value="True" /> 
          <Condition Property="IsMouseOver" 
             Value="True" /> 
         </MultiTrigger.Conditions> 
         <MultiTrigger.Setters> 
          <Setter Property="Background" 
            Value="{DynamicResource TgCheckedAndOver}" /> 
         </MultiTrigger.Setters> 
        </MultiTrigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsChecked" 
             Value="True" /> 
          <Condition Property="IsMouseOver" 
             Value="False" /> 
         </MultiTrigger.Conditions> 
         <MultiTrigger.Setters> 
          <Setter Property="Background" 
            Value="{DynamicResource TgChecked}" /> 
         </MultiTrigger.Setters> 
        </MultiTrigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsChecked" 
             Value="False" /> 
          <Condition Property="IsMouseOver" 
             Value="False" /> 
         </MultiTrigger.Conditions> 
         <MultiTrigger.Setters> 
          <Setter Property="Background" 
            Value="#88000000" /> 
         </MultiTrigger.Setters> 
        </MultiTrigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsChecked" 
             Value="False" /> 
          <Condition Property="IsMouseOver" 
             Value="True" /> 
         </MultiTrigger.Conditions> 
         <MultiTrigger.Setters> 
          <Setter Property="Background" 
            Value="#F0000000" /> 
         </MultiTrigger.Setters> 
        </MultiTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

这是动态资源的定期使用。现在,当你想改变appearence只为特定的控制,你这样做:

<ToggleButton> 
    <ToggleButton.Resources> 
     <!-- override default resources --> 
     <SolidColorBrush x:Key="TgChecked" Color="Yellow" /> 
     <SolidColorBrush x:Key="TgCheckedAndOver" 
         Color="Green" /> 
    </ToggleButton.Resources> 
    <Image Source="../Assets/icons/action.png" Height="26" RenderOptions.BitmapScalingMode="Fant" /> 
</ToggleButton> 

因为你把新的资源使用相同的按键更“接近”的控制 - 模板将改为使用它们的默认的,只是这个特定的控制会做到这一点,而不是全部。

+0

啊,这太好了。我绝对可以看到这在其他情况下也很有用。谢谢! – monoceres

0

不幸的是,ControlTemplates是一件全有或全无的事情。如果你想改变你在里面引用的颜色,你必须切换模板。我想在模板中有引用资源不适合你。

我会为OptionBarButton中的每个变量颜色创建依赖属性。

+0

好的,我明白了。除ControlTemplates之外是否还有其他技术更适合这种情况? – monoceres

+0

我刚刚看到DynamicResource解决方案。我很喜欢。去那边! – SuperJMN