2

每次选中或不选中切换按钮时,我都会尝试更改其背景,使用 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

4 回答 4

3

您能否检查一下您的图像的构建操作是否是嵌入式资源?

于 2013-09-17T08:46:17.497 回答
3

我们可以在这里指出很多事情。

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

<ToggleButton Name="toggle1" Height="25" Padding="0" Width="27" Canvas.Left="131" Canvas.Top="0" BorderBrush="{x:Null}" Foreground="{x:Null}" Style="{DynamicResource MyToggleButtonStyle}">

如果您愿意,您可以删除 Style 中的 Key 并使其隐式应用于ToggleButtonStyle 定义范围内的 "all" 。

于 2013-09-17T09:01:05.173 回答
2

您应该删除 x:Key 并且它将起作用。

于 2013-09-17T09:06:09.910 回答
2

直接为您的切换按钮定义样式,如下所示。它应该可以解决您的问题:

<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>
于 2013-09-17T09:04:40.233 回答