2011-08-24 84 views
1

我试图设计一个按钮模板,它在按下时交换颜色。在按下按钮模板时交换颜色

不幸的是我不能得到它的工作。

我正在使用BorderBrush作为临时变量。很可能有更复杂的解决方案。

这是我的代码。

<Style TargetType="{x:Type Button}"> 
     <Style.Setters> 
      <Setter Property="Foreground" 
        Value="{StaticResource RahmenFarbe}" /> 
      <Setter Property="Background" 
        Value="{StaticResource HintergrundFarbe}" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Grid Width="{TemplateBinding Width}" 
           Height="{TemplateBinding Height}" 
           ClipToBounds="True"> 
          <Border BorderBrush="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button, AncestorLevel=1}, Path=Foreground}" 
            x:Name="ButtonBorder" 
            CornerRadius="25" 
            BorderThickness="4" 
            Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button, AncestorLevel=1}, Path=Background}" 
            RenderTransformOrigin="0.5,0.5"> 
           <TextBlock x:Name="ButtonTextBlock" 
              Foreground="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button, AncestorLevel=1}, Path=Foreground}" 
              VerticalAlignment="Center" 
              HorizontalAlignment="Center"> 
           <ContentPresenter x:Name="myContentPresenter" 
                Content="{TemplateBinding Content}" /> 
           </TextBlock> 
          </Border> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsPressed" 
            Value="True"> 
           <Setter Property="BorderBrush" 
             Value="{Binding Mode=OneTime, Path=Foreground}" /> 
           <Setter Property="Foreground" 
             Value="{Binding Mode=OneTime, Path=Background}" /> 
           <Setter Property="Background" 
             Value="{Binding Mode=OneTime, Path=BorderBrush}" /> 
          </Trigger> 
         </ControlTemplate.Triggers > 

        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style.Setters> 
    </Style> 

任何帮助,将不胜感激。

问候塞巴斯蒂安

回答

3

更新

终于明白自己真正想做的事。这是你如何完成它。绑定到TemplatedParentBackgroundForeground并在设置者中设置TargetName。这样一来,对于颜色的源将始终保持不变,您可以轻松地交换他们

<ControlTemplate.Triggers> 
    <Trigger Property="IsPressed" Value="True"> 
     <Setter TargetName="ButtonBorder" 
       Property="Background" 
       Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Foreground}" /> 
     <Setter TargetName="ButtonTextBlock" 
       Property="Foreground" 
       Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}" /> 
    </Trigger> 
</ControlTemplate.Triggers> 

或者,您也可以从

改变你 TemplateBindings
Background="{Binding Path=Background, 
        RelativeSource={RelativeSource FindAncestor, 
                AncestorType=Button, 
                AncestorLevel=1}}" 

要只是

Background="{TemplateBinding Background}" 
+0

我绝对同意。但我喜欢存档的另一件事是,当我更改按钮中的颜色时,行为(交换)保持不变。这看起来很尴尬,如果硬编码的颜色。我担心我必须去找代码(borderbrush刚刚被滥用作为临时变量) – Athanviel

+0

但是您已经在模板中将Foreground和Background设置为静态资源,它是如何被滥用的?如果你想使其动态化,可以使用'DynamicResource'来代替你需要的地方。另一种选择是使用附加属性。您将无法通过将前景设置为背景来交换它们,因为背景也在变化 –

+0

实际上,我将边框的前景和背景绑定到按钮的边框。那些绑定应该是静态的。在触发器中,我更改按钮属性,所以其他绑定不应该受到影响。我试图通过“绑定模式=一次”来避免自动更改。 DynamicResource没有按照我的意图工作,但也许我没有正确使用它。 – Athanviel

0

这是带有代码隐藏的解决方案。

<Style TargetType="{x:Type Button}"> 
     <Style.Setters> 
      <Setter Property="Foreground" 
        Value="{StaticResource RahmenFarbe}" /> 
      <Setter Property="Background" 
        Value="{StaticResource HintergrundFarbe}" /> 
      <Setter Property="FontSize" 
        Value="18" /> 
      <Setter Property="FontWeight" 
        Value="Bold" /> 
      <EventSetter Event="PreviewMouseDown" 
         Handler="vertauscheFarben" /> 
      <EventSetter Event="PreviewMouseUp" 
         Handler="vertauscheFarben" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Grid Width="{TemplateBinding Width}" 
           Height="{TemplateBinding Height}" 
           ClipToBounds="True"> 
          <Border BorderBrush="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button, AncestorLevel=1}, Path=Foreground}" 
            x:Name="ButtonBorder" 
            CornerRadius="25" 
            BorderThickness="4" 
            Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button, AncestorLevel=1}, Path=Background}" 
            RenderTransformOrigin="0.5,0.5"> 
           <TextBlock x:Name="ButtonTextBlock" 
              Foreground="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button, AncestorLevel=1}, Path=Foreground}" 
              VerticalAlignment="Center" 
              HorizontalAlignment="Center"> 
           <ContentPresenter x:Name="myContentPresenter" 
                Content="{TemplateBinding Content}" /> 
           </TextBlock> 
          </Border> 
         </Grid> 

        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style.Setters> 
    </Style> 

这是代码隐藏

Private Sub vertauscheFarben(sender As Object, e As MouseButtonEventArgs) 
    Dim Button = DirectCast(sender, Button) 

    Dim Temp = Button.Foreground 
    Button.Foreground = Button.Background 
    Button.Background = Temp 
End Sub 

这是工作,但我会内的XAML喜欢它 - 所以我不会庆祝这个作为回答。