更改背景切换按钮

时间:2013-09-17 08:39:51

标签: c# .net wpf togglebutton

我每次检查时都会尝试更改切换按钮的背景,使用2张图片。在运行时,切换按钮很简单,我看不到任何图像。这是我的代码:

<Canvas Height="25" Name="canvas1" Width="186" Background="White">
    <ToggleButton Name="toggle1" Height="25" Padding="0" Width="27" Canvas.Left="131" Canvas.Top="0" BorderBrush="{x:Null}" Foreground="{x:Null}">

        <ToggleButton.Resources>
            <Style x:Key="OnOffToggleImageStyle" TargetType="ToggleButton">
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Background">
                            <Setter.Value>
                                <ImageBrush ImageSource="/WpfApp;component/Images/image1.png" Stretch="Uniform" TileMode="None" />
                            </Setter.Value>
                    </Setter>
                </Trigger>
                <Trigger Property="IsChecked" Value="False">
                    <Setter Property="Background">
                        <Setter.Value>
                                <ImageBrush ImageSource="/WpfApp;component/Images/image2.png" Stretch="Uniform" TileMode="None" />
                            </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>

             

4 个答案:

答案 0 :(得分:3)

您可以检查图片的构建操作是否为嵌入式资源?

答案 1 :(得分:3)

我们可以在这里指出多个事项。

  • 首先,您使用StyleToggleButton.Resources中指定x:Key。因此它没有隐含地设定。在其自身范围内为其应用的项目的资源设置Style有点奇怪。而只是将Style直接应用为<ToggleButton.Style>
  • 接下来,在使用Style.Triggers时,请务必指定默认的Setter。这可以防止你头疼。此外,现在不是为IsChecked = False / True设置两个触发器,而是只需要一个触发器,因为另一个Background可以设置为默认值。
  • 最后,似乎ToggleButton所需要的只是IsChecked属性并切换Image。所以只需覆盖Template并自己提供一个简单的。通过这种方式,您可以确保行为在所有版本的操作系统中保持一致,而不依赖于内部默认模板可以很好地为您的自定义工作(这在Windows-8顺便说一下,你在这里尝试{{1}由于默认IsChecked=True
  • 中的内部覆盖

所以把这一切放在一起我们得到:

ControlTemplate

并将其应用于您的<Style x:Key="MyToggleButtonStyle" TargetType="ToggleButton"> <Setter Property="Background"> <Setter.Value> <ImageBrush ImageSource="/WpfApp;component/Images/image2.png" Stretch="Uniform" TileMode="None" /> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ToggleButton"> <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Background="{TemplateBinding Background}" /> </ControlTemplate> </Setter.Value> </Setter> <Style.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter Property="Background"> <Setter.Value> <ImageBrush ImageSource="/WpfApp;component/Images/image1.png" Stretch="Uniform" TileMode="None" /> </Setter.Value> </Setter> </Trigger> </Style.Triggers> </Style>

ToggleButton

如果您愿意,可以删除样式中的Key并使其隐式应用于Style定义范围内的“all”<ToggleButton Name="toggle1" Height="25" Padding="0" Width="27" Canvas.Left="131" Canvas.Top="0" BorderBrush="{x:Null}" Foreground="{x:Null}" Style="{DynamicResource MyToggleButtonStyle}">

答案 2 :(得分:2)

直接为您的togglebutton定义样式,如下所示。它应该解决你的问题:

<ToggleButton>
      <ToggleButton.Style>
            <Style  TargetType="ToggleButton">
                <Setter Property="Background">
                    <Setter.Value>
                        <ImageBrush ImageSource="/WpfApp;component/Images/image2.png" Stretch="Uniform" TileMode="None" />
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Background">
                            <Setter.Value>
                                <ImageBrush ImageSource="/WpfApp;component/Images/image1.png" Stretch="Uniform" TileMode="None" />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ToggleButton.Style>
</ToggleButton>

答案 3 :(得分:2)

你应该删除x:Key,它会起作用。