【问题标题】:DataTriggers: What's wrong?数据触发器:怎么了?
【发布时间】:2013-11-23 08:36:55
【问题描述】:

我正在尝试在我的 ToggleButton 上使用自定义皮肤。这是我的ToggleButton

<ToggleButton Template="{StaticResource OnTemplate}" IsChecked="True" >
    <ToggleButton.Style>
        <Style TargetType="ToggleButton">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsChecked}" Value="True">
                    <Setter Property="Template" Value="{StaticResource OnTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=IsChecked}" Value="False">
                    <Setter Property="Template" Value="{StaticResource OffTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

这是两个模板:

<ControlTemplate x:Key="OnTemplate">
    <Grid>
        <Image Source="ToggleOn.png" />
        <TextBlock>On</TextBlock>
    </Grid>
</ControlTemplate>

<ControlTemplate x:Key="OffTemplate">
    <Grid>
        <Image Source="ToggleOff.png" />
        <TextBlock>Off</TextBlock>
    </Grid>
</ControlTemplate>

这似乎行不通。我做错了什么?

【问题讨论】:

    标签: .net wpf xaml controltemplate datatrigger


    【解决方案1】:

    尝试简单地从按钮定义中删除 Template="{StaticResource OnTemplate}"。本地值胜过触发器/样式设置器的值。

    此外,您需要使用常规的Trigger 而不是DataTrigger,或者您需要在DataTrigger 绑定上设置RelativeSource={RelativeSource Self}。我推荐前者。

    【讨论】:

    • 这行得通。触发器是我需要的东西。加上 Template 的本地值实际上阻止了 Style 实现其更改。谢谢大家,尤其是迈克。
    • 另外,我可以在我的&lt;ToggleButton.Resources&gt; 部分中移动两个ControlTemplates 吗?我试过了,但我无法在Value="{StaticResource OnTemplate}" 部分引用它们。
    • 我相信你可以,但是资源需要在 Xaml 中出现被引用之前。由于您在按钮声明中引用了模板,它可能以前不起作用。
    • 最后但并非最不重要的一点是,触发器似乎在我的 ToggleButton 的Checked 事件之后触发,这会产生不受欢迎的感觉。我可以在Checked 事件的处理程序开始执行之前应用模板吗?
    • 不是这样,但您可以在IsPressed 上添加一个触发器,例如,调整边距以将内容移动到底部/右侧以模拟“按下”效果。我经常将此效果用于“无边框”按钮(将Margin 调整为1,1,-1,-1)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2011-09-23
    • 2017-05-20
    • 2012-04-06
    相关资源
    最近更新 更多