none
求解,对CheckBox使用ControlTemplate.Triggers后,只能部分起效。 RRS feed

  • 问题

  • 各位专家:

            本人在学习ControlTemplate中的Triggers时,发现如下问题:

            本人原想实现的目的是:根据CheckBox的IsChecked属性值触发在ControlTemplate中自定义的触发器Triggers,CheckBox的字体发生相应变化。

            目前的问题是:只有在一开始CheckBox的IsChecked属性为True时,自己定义的模板与模板中的触发器才有用。若一开始IsChecked属性为False则板与模板中的触发器失灵。即使是一开始CheckBox的IsChecked属性为True时,在随后的IsChecked属性变化时,自己定义的模板与模板中的触发器却也不在动作。

            我明明已经使用了Template="{DynamicResource aaa}"这样的动态资源为什么还不行?

            如何改进才能使自定义的ControlTemplate和其中的触发器在上述三种情况中都有效果,还请指点。

    页面详细代码如下:

    <Window x:Class="WPF_Trigger_2_ControlTemplate.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WPF_Trigger_2_ControlTemplate"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <ControlTemplate TargetType="CheckBox" x:Key="aaa" >
                <CheckBox Content="abcdef"/>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="true">
                        <Trigger.Setters>
                            <Setter Property="FontSize" Value="28"/>
                        </Trigger.Setters>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Window.Resources>
        <Grid>
            <CheckBox x:Name="checkBox" Template="{DynamicResource aaa}"  HorizontalAlignment="Left" Margin="140,74,0,0" VerticalAlignment="Top" IsChecked="True"/>
        </Grid>
    </Window>
    

    2016年3月2日 15:33

答案

  • 这块我建议可以了解下样式里面的值优先级,比如本地值,setter值和触发值。

    你可以设置一个本地值,但是本地值的优先级过高,设置了之后触发和setter就无法起作用,对于你的问题,你需要设置一个Setter值,然后这个值就是控件地默认值,这样通过触发器就可以改变值并且之后可以恢复。

    对于什么时候用样式什么时候用模板,我的建议是,你需要改变外观,就需要用模板来设计;你需要改变某个属性或者行为,那么样式就足够了。

    两者之间还是有比较大的区别,比如对于内容的呈现,元素的名字空间,触发器的目标等都是不同的。


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    • 已标记为答案 wxysy 2016年3月14日 12:44
    2016年3月12日 1:16
    版主

全部回复

  • 三个问题:

    一: 你的触发器只有在False -> True 工作,那么True-〉False你没有设置,所以就不会工作了。你需要设置一个默认的FontSize值,或者添加一个触发器对于False状态触发

    二:为什么你的ControlTemplate里面还有一个CheckBox, 很不合理。既然你要重写Template 但是你又把它本身放入了模板,就像你的钱包本来是放钱的,但是你不喜欢钱包的样子,换了一个透明的钱包,里面把原来那个放进去了。结果开上去还是原来那个钱包的样子。

    三: 你的需求其实用Style 和 Style Trigger 就可以完成,没有必要去重写一个Template


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2016年3月3日 3:56
    版主
  • 感谢版主的答复,但我还是有几个疑惑。

    1、我曾在刘铁锰著《深入浅出WPF》P237页看到这样的解释:“Trigger类中还有一个Setter属性,此属性值时一组Setter,一旦触发条件被满足,这组Setter的“属性-值”就会被应用,触发条件不满足后,各属性值会还原。”,不知这个“还原”究竟是指什么?如果是能“还原”的话,那么是否还有必要添加对于False的状态触发?

    2、我之所以在ControlTemplate里面放了一个CheckBox的Content属性,就是想给CheckBox设置一个默认的Content值,与您在“一”中回答的观点是一致的,看来是我的方法不对,不知正确写法是怎么样的?

    3、即使是添加了如

    <Trigger Property="IsChecked" Value="false">
         <Trigger.Setters>
               <Setter Property="FontSize" Value="18"/>
         </Trigger.Setters>
     </Trigger>

    这样的对于False状态的触发,在程序运行后,无论是否勾选CheckBox,字体依旧不变化,不知该如何修改?

    急盼您的回复!


    • 已编辑 wxysy 2016年3月3日 12:18 发现新的问题
    2016年3月3日 12:07
  • 这块我建议可以了解下样式里面的值优先级,比如本地值,setter值和触发值。

    你可以设置一个本地值,但是本地值的优先级过高,设置了之后触发和setter就无法起作用,对于你的问题,你需要设置一个Setter值,然后这个值就是控件地默认值,这样通过触发器就可以改变值并且之后可以恢复。

    对于什么时候用样式什么时候用模板,我的建议是,你需要改变外观,就需要用模板来设计;你需要改变某个属性或者行为,那么样式就足够了。

    两者之间还是有比较大的区别,比如对于内容的呈现,元素的名字空间,触发器的目标等都是不同的。


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    • 已标记为答案 wxysy 2016年3月14日 12:44
    2016年3月12日 1:16
    版主
  • 非常感谢您的建议,我这就看下。
    2016年3月14日 12:28