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

ここで指摘できることは複数あります。

  • まず、StyleinToggleButton.Resourcesを aで指定していx:Keyます。したがって、暗黙的に設定されるわけではありません。Style独自のスコープで適用されるアイテムのリソースにa を設定するのはちょっと奇妙です。むしろ、Styleとして直接適用して<ToggleButton.Style>ください。
  • 次に、 を使用するときはStyle.Triggers、デフォルトの Setter を指定することを習慣にします。これにより、頭痛をある程度防ぐことができます。また、IsChecked=False/True に対して 2 つのトリガーを使用する代わりに、もう 1 つのトリガーをBackgroundデフォルトとして設定できるため、必要なトリガーは 1 つだけです。
  • 最後に、から必要なのToggleButtonIsCheckedプロパティとスイッチ anだけのようImageです。したがって、をオーバーライドしてTemplate、単純なものを自分で提供してください。このようにして、OSのすべてのバージョンで動作が一貫していることを保証し、内部のデフォルトテンプレートがカスタマイズのためにうまく機能することに依存しません(これはWindows-8では機能しません.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

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

スタイル内のキーを削除して、必要ToggleButtonに応じてスタイル定義の範囲内の「すべて」に暗黙的に適用することができます。

于 2013-09-17T09:01:05.173 に答える
3

画像のビルド アクションが埋め込みリソースかどうかを確認できますか?

于 2013-09-17T08:46:17.497 に答える
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 に答える