首页 文章

ToggleButton Style仅适用于最后一个ToggleButton

提问于
浏览
1

我正在尝试自定义我的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是任一值的最后一个,则它会正确显示 . 具有相同值的所有先前按钮均为空白 . 身高也在缩小,但我用触发器上方的'Height'Setter修正了它 . 为了说明,当创建新记录时,它看起来像:

Startup toggle buttons
并在我再次点击按钮1,2和3以后:
edited toggle buttons

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

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

但改变这一点,以便每个ToggleButton单独引用样式( <ToggleButton Style="{StaticResource YesNoToggleStyle}" ... /> )并没有什么不同 .

我看了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附带的混合sketchflow预览,并且b)我在答案中从 Select the "Checked State"Reset the Background Color 指令(如果这个任务我会感到惊讶)需要混合工具) .

任何人都可以告诉我该怎么做才能让多个ToggleButtons正确使用相同的风格?

3 回答

  • 0

    这适合我 . 某处 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>
    
  • 1

    尝试将Content属性替换为ContentTemplate:

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

    在我的情况下,我希望在一个公共dll中有一个“Locked”ToggleButton,并在我的应用程序中重复使用 . 这是我的结果,对我有用 . 也许有人发现它很有用(把它放在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

相关问题