Обмен цветов в кнопке-шаблоне при нажатии - PullRequest
1 голос
/ 24 августа 2011

Я пытаюсь создать шаблон кнопки, который меняет свои цвета при нажатии.

К сожалению, я не могу заставить его работать.

Я использую 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>

Буду признателен за любую помощь.

С уважением, Себастьян

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Обновление

Наконец-то понял, что ты действительно хотел сделать.Вот как вы это сделали.Привязать к TemplatedParent Background и Foreground и установить 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>

При желании вы также можете изменить Bindings в вашем Template с

Background="{Binding Path=Background,
                     RelativeSource={RelativeSource FindAncestor,
                                                    AncestorType=Button,
                                                    AncestorLevel=1}}"

Просто

Background="{TemplateBinding Background}"
0 голосов
/ 25 августа 2011

Вот решение с codebehind.

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

Это CodeBehind

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 - поэтому я не буду отмечатьэто как ответ.

...