首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wpf:将样式DataTrigger更改为ControlTemplate DataTrigger

wpf:将样式DataTrigger更改为ControlTemplate DataTrigger
EN

Stack Overflow用户
提问于 2013-10-29 00:32:34
回答 2查看 13.3K关注 0票数 0

我有一个大的ControlTemplate作为ToggleButton。我试图在没有成功的情况下添加数据触发器。

不过,我还是使用样式添加了它,如下所示:

代码语言:javascript
复制
    <Window.Resources>
    <Style x:Key="toggleBtnStyle" TargetType="{x:Type ToggleButton}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=myProperty}" Value="true">
                <Setter Property="Content" Value="IS TRUE"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=myProperty}" Value="false">
                <Setter Property="Content" Value="IS FALSE"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<ToggleButton Height="34" HorizontalAlignment="Left" x:Name="toggleBroadcast" Click="Button_Click" VerticalAlignment="Top" Width="133" Margin="180,0,0,0" Style="{DynamicResource toggleBtnStyle}"/>

是否有将此添加到Control模板的方法?下面的控件模板是在IsChecked属性ToggleButton上触发的,我试图按上面的样式将其更改为DataTrigger,但没有成功。

代码语言:javascript
复制
        <ControlTemplate x:Key="ClipBoardButton1" TargetType="{x:Type ToggleButton}">
        <Border BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" BorderBrush="Black" Background="Black" >
            <Grid>
                <Border x:Name="BorderUp" BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" Background="Blue"/>
                <Border x:Name="BorderDown" BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" Opacity="0" Background="Aqua"/>
                <ContentPresenter x:Name="Contents" HorizontalAlignment="Center" VerticalAlignment="Center" Width="Auto" Margin="0,0,0,0"/>
            </Grid>
        </Border>

        <ControlTemplate.Resources>
            <Storyboard x:Key="ButtonDownTimeLine">
                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="BorderDown" Storyboard.TargetProperty="Opacity">
                    <SplineDoubleKeyFrame KeyTime="00:00:00.05" Value="1"/>
                </DoubleAnimationUsingKeyFrames>
                <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Contents" Storyboard.TargetProperty="Margin">
                    <SplineThicknessKeyFrame KeyTime="00:00:00.025" Value="0.5,0.5,0,0"/>
                </ThicknessAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Key="ButtonUpTimeLine">
                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="BorderDown" Storyboard.TargetProperty="Opacity">
                    <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="0"/>
                </DoubleAnimationUsingKeyFrames>
                <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Contents" Storyboard.TargetProperty="Margin">
                    <SplineThicknessKeyFrame KeyTime="00:00:00.25" Value="0,0,0,0"/>
                </ThicknessAnimationUsingKeyFrames>
            </Storyboard>
        </ControlTemplate.Resources>

        <ControlTemplate.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Trigger.EnterActions>
                    <BeginStoryboard Storyboard="{StaticResource ButtonDownTimeLine}"/>
                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <BeginStoryboard Storyboard="{StaticResource ButtonUpTimeLine}"/>
                </Trigger.ExitActions>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

要明确:

  1. 我想在myProperty上使用myProperty
  2. 当前具有与IsChecked操作相同的触发器操作。(实现故事板)

我尝试了很多不同的东西,搜索了这么多的帖子,但是找不到我想要的答案。

有人能告诉我我需要做什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-29 04:41:37

我猜,您正在使用一种样式将此Template应用于ToggleButton。如果没有,请为ToggleButton创建默认样式,并将Template属性设置为ControlTemplate

代码语言:javascript
复制
<Style TargetType="ToggleButton">
    <Setter Property="Template" Value="{StaticResource ClipBoardButton1}" />
</Style>

而且,关于使用DataTriggers的问题,我不会将DataTriggers添加到ControlTemplate中,因为,考虑一下这个场景,当您想要在不同的地方使用相同的模板时,会发生什么?

要实现您正在尝试的目标,可以将ControlTemplate中的ControlTemplate更新为以下内容:

代码语言:javascript
复制
<Trigger Property="IsChecked" Value="True">
    <Setter Property="Content" Value="IS TRUE" />
    <Trigger.EnterActions>
        <BeginStoryboard Storyboard="{StaticResource ButtonDownTimeLine}"/>
    </Trigger.EnterActions>
    <Trigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource ButtonUpTimeLine}"/>
    </Trigger.ExitActions>
</Trigger>
<Trigger Property="IsChecked" Value="False">
    <Setter Property="Content" Value="IS FALSE"></Setter>
</Trigger>

并将IsChecked属性ToggleButton绑定到myProperty

代码语言:javascript
复制
<ToggleButton Height="34" HorizontalAlignment="Left" 
              x:Name="toggleBroadcast" 
              Click="Button_Click" 
              VerticalAlignment="Top" 
              Width="133" Margin="180,0,0,0" 
              IsChecked="{Binding myProperty}"/>

更新

ControlTemplate中的触发器替换为:

代码语言:javascript
复制
<DataTrigger Binding="{Binding myProperty}" Value="True">
    <DataTrigger.EnterActions>
        <BeginStoryboard Storyboard="{StaticResource ButtonDownTimeLine}"/>
    </DataTrigger.EnterActions>
    <DataTrigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource ButtonUpTimeLine}"/>
    </DataTrigger.ExitActions>
</DataTrigger>
票数 4
EN

Stack Overflow用户

发布于 2013-10-29 01:57:59

您可以在样式中使用控件模板。如下所示。我希望这能帮到你

代码语言:javascript
复制
<Window.Resources>
    <Style x:Key="toggleBtnStyle" TargetType="{x:Type ToggleButton}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=myProperty}" Value="true">
                <Setter Property="Content" Value="IS TRUE"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=myProperty}" Value="false">
                <Setter Property="Content" Value="IS FALSE"/>
            </DataTrigger>
        </Style.Triggers>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToggleButton}">
                    <Border BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" BorderBrush="Black" Background="Black" >
                        <Grid>
                            <Border x:Name="BorderUp" BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" Background="Blue"/>
                            <Border x:Name="BorderDown" BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" Opacity="0" Background="Aqua"/>
                            <ContentPresenter x:Name="Contents" HorizontalAlignment="Center" VerticalAlignment="Center" Width="Auto" Margin="0,0,0,0"/>
                        </Grid>
                    </Border>

                    <ControlTemplate.Resources>
                        <Storyboard x:Key="ButtonDownTimeLine">
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="BorderDown" Storyboard.TargetProperty="Opacity">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.05" Value="1"/>
                            </DoubleAnimationUsingKeyFrames>
                            <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Contents" Storyboard.TargetProperty="Margin">
                                <SplineThicknessKeyFrame KeyTime="00:00:00.025" Value="0.5,0.5,0,0"/>
                            </ThicknessAnimationUsingKeyFrames>
                        </Storyboard>
                        <Storyboard x:Key="ButtonUpTimeLine">
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="BorderDown" Storyboard.TargetProperty="Opacity">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="0"/>
                            </DoubleAnimationUsingKeyFrames>
                            <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Contents" Storyboard.TargetProperty="Margin">
                                <SplineThicknessKeyFrame KeyTime="00:00:00.25" Value="0,0,0,0"/>
                            </ThicknessAnimationUsingKeyFrames>
                        </Storyboard>
                    </ControlTemplate.Resources>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Trigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource ButtonDownTimeLine}"/>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <BeginStoryboard Storyboard="{StaticResource ButtonUpTimeLine}"/>
                            </Trigger.ExitActions>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19647602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档