【问题标题】:ToggleButton Style only works on last ToggleButtonToggleButton Style 仅适用于最后一个 ToggleButton
【发布时间】:2013-03-03 17:44:58
【问题描述】:

我正在尝试自定义我的 ToggleButtons,以便在选中时以绿色表示“是”,在未选中时以红色表示“否”。

我创建了以下样式,它位于我的样式资源字典中。

<!--  ToggleButtons   -->
<Style x:Key="YesNoToggleStyle" TargetType="ToggleButton">
  <Style.Triggers>
    <Trigger Property="IsChecked" Value="True">
      <Setter Property="Background" Value="SpringGreen" />
      <Setter Property="Content">
        <Setter.Value>
          <TextBlock Text="Yes"/>
        </Setter.Value>
      </Setter>
    </Trigger>
    <Trigger Property="IsChecked" Value="False">
      <Setter Property="Background" Value="Crimson" />
      <Setter Property="Content">
        <Setter.Value>
          <TextBlock Text="No"/>
        </Setter.Value>
      </Setter>
    </Trigger>
  </Style.Triggers>
</Style>

这行得通……有点。如果 ToggleButton 是任一值的最后一个,则它会正确显示。之前所有具有相同值的按钮都是空白的。高度也在缩小,但我用触发器上方的“高度”设置器修复了它。为了说明,当创建新记录时,它看起来像:

在我再次单击按钮 1、2、3 和 1 后:

我最初有从周围网格引用的样式:

<Grid>
  ...
    <Grid.Resources>
      <Style BasedOn="{StaticResource YesNoToggleStyle}" TargetType="{x:Type ToggleButton}" />
    </Grid.Resources>

但改变这一点,使每个 ToggleButton 单独引用样式 (&lt;ToggleButton Style="{StaticResource YesNoToggleStyle}" ... /&gt;) 并没有什么不同。

我看了Customizing the toggle state of a toggle button in wpfOverride ToggleButton Style,效果是一样的,但是他们讲的是外部图片,我的问题都在wpf里面。

我还查看了第二个答案:i want to change backcolor of toggle button when toggle button ischecked and viceversa in WPF,但是 a) 我只有 VS2012 附带的 blend + sketchflow 预览,b) 我完全是一个 blend 菜鸟,无法从 @987654329 获得@ to Reset the Background Color 答案中的指令(如果此任务需要混合工具,我会感到惊讶)。

谁能告诉我如何让多个切换按钮正确使用相同的样式?

【问题讨论】:

    标签: c# wpf controltemplate togglebutton


    【解决方案1】:

    这对我有用。在Dictionary1.xaml 某处:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Style x:Key="YesNoToggleStyle" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}">
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="False">
                    <Setter Property="Background" Value="Crimson" />
                    <Setter Property="Content" Value="No"/>
                </Trigger>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Background" Value="SpringGreen" />
                    <Setter Property="Content" Value="Yes"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ResourceDictionary>
    

    注意,该样式基于ToolBar.ToggleButtonStyle

    <Grid>
        <Grid.Resources>
            <ResourceDictionary Source="pack://application:,,,/Dictionary1.xaml"/>
        </Grid.Resources>
    
        <ItemsControl ItemContainerStyle="{StaticResource YesNoToggleStyle}">
            <ToggleButton />
            <ToggleButton />
            <ToggleButton />
        </ItemsControl>
    </Grid>
    

    【讨论】:

    • 谢谢。这可以完成工作。如果可以的话,有几个问题:是否有非工具栏的解决方案(我喜欢标准 ToggleButton 的按钮按下效果)?另外,为什么我的尝试不起作用〜我做错了什么?
    • @mcalex:您的代码看起来不错。在我看来,问题出在ToggleButton 的控制模板中。我会查看这个模板和在 ToolBar 中定义的样式来比较它们。请注意,如果切换按钮将直接放置在网格中,而不是项目控件中,则不会应用该样式 - 这绝对是查看控件模板的原因。
    【解决方案2】:

    尝试将 Content 属性替换为 ContentTemplate:

      <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <TextBlock Text="Yes"/>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    

    【讨论】:

    • 宾果游戏。我猜测与在多个父母中重复使用相同的内容有关
    【解决方案3】:

    在我的情况下,我希望在一个通用 dll 中定义一个“锁定”切换按钮,并在我的应用程序中重复使用。 这是我的结果,它对我有用。也许有人觉得它有用(把它放在 Resourcedictionary.xaml 中):

    <BitmapImage  x:Key="LockedLock"
                  UriSource="/...;component/Resources/Lock_closed_16p.png" />
    <BitmapImage  x:Key="OpenLock"
                  UriSource="/...;component/Resources/Lock_open_16p.png" />
    
    <Style x:Key="LockButton"
           TargetType="ToggleButton">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Image Source="{DynamicResource OpenLock }"
                           Width="12"
                           Height="12"
                           Name="contentimage" />
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ToggleButton , AncestorLevel=1, Mode=FindAncestor }, Path=IsChecked}"
                                     Value="True">
                            <Setter Property="Image.Source"
                                    TargetName="contentimage"
                                    Value="{DynamicResource LockedLock }" />
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    归功于:

    Setting Button's Content to <Image> via Styles

    Setter Target Name not recognized

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2011-11-05
      • 2013-03-20
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      相关资源
      最近更新 更多