グループ化されたラジオボタンをトグルボタンとしてスタイルする必要があります。WPFラジオボタンを正しいIsEnabled動作のトグルボタンとして使用
Style="{StaticResource {x:Type ToggleButton}}"
これは私に私が好きなスタイルを提供しますが、私は迷惑な副作用に気づいた:これを行うには、私はラジオボタンに次のスタイルを適用しました。私はコントロールが無効になっている間、選択されたボタンを変更することができる必要があります。これは通常のラジオボタンでは正常に動作します。しかし、トグル・ボタン・スタイルのボタンでは、選択されたボタンの1つが表示されなくなりました。
次のデモでは、[Toggle enabled]ボタンを繰り返しクリックすると、選択したボタンが再度有効になっても強調表示されていることがわかります。ただし、選択したボタンを無効にしてから再度有効にすると([Toggle enabled]、[Change value]、[Toggle enabled]をクリック)、いずれのボタンも強調表示されません。私が達成しようとしている何
:
- は、トグルボタンのスタイルにできるだけ近くにしてください。
- チェックされたボタンが無効になっているときは、青色の背景は維持しますが、不透明です。
- 値が変更されているかどうかにかかわらず、ボタンが再び有効になったときに標準のToggleButtonスタイルを使用します。
XAML:背後
<Window x:Class="ToggleButtonDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ToggleButtonDemo"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="200"
Name="demoWindow"
DataContext="{Binding ElementName=demoWindow}">
<StackPanel>
<GroupBox Header="Radio" IsEnabled="{Binding Enable}">
<StackPanel Orientation="Horizontal">
<RadioButton Name="radio1" Content="One" GroupName="RadioGroup" IsChecked="True"/>
<RadioButton Name="radio2" Content="Two" GroupName="RadioGroup"/>
</StackPanel>
</GroupBox>
<GroupBox Header="Toggle" IsEnabled="{Binding Enable}">
<StackPanel Orientation="Horizontal">
<RadioButton Name="toggle1" Content="One" GroupName="ToggleGroup" Style="{StaticResource {x:Type ToggleButton}}" IsChecked="True"/>
<RadioButton Name="toggle2" Content="Two" GroupName="ToggleGroup" Style="{StaticResource {x:Type ToggleButton}}"/>
</StackPanel>
</GroupBox>
<Button Name="toggle" Content="Toggle enabled" Click="toggle_Click"/>
<Button Name="changeValue" Content="Change value" Click="changeValue_Click"/>
</StackPanel>
</Window>
コード:
using System.ComponentModel;
using System.Windows;
namespace ToggleButtonDemo
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private bool mEnable = true;
public bool Enable
{
get
{
return mEnable;
}
set
{
mEnable = value;
OnPropertyChanged(nameof(Enable));
}
}
public MainWindow()
{
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void toggle_Click(object sender, RoutedEventArgs e)
{
Enable = !Enable;
}
private void changeValue_Click(object sender, RoutedEventArgs e)
{
if (radio1.IsChecked == true)
{
radio2.IsChecked = true;
}
else if (radio2.IsChecked == true)
{
radio1.IsChecked = true;
}
if (toggle1.IsChecked == true)
{
toggle2.IsChecked = true;
}
else if (toggle2.IsChecked == true)
{
toggle1.IsChecked = true;
}
}
}
}
これは素晴らしいです。それは私に私が探している振る舞いを与えます。これほど多くのスタイルを再定義することなくこれを達成することは可能ですか?私は本当に標準のToggleButtonスタイルをもっと保持したいと思います。 – sclarke81
いいえ、テンプレート全体を再定義する必要があります。テンプレートの一部のみをオーバーライドすることはできません。しかし、これは、Windows 10で少し変わってもデフォルトのテンプレートのように見えます。 VSまたはブレンドのデザインモードでToggleButtonを右クリックし、[テンプレートの編集] - > [コピーの編集]を選択し、必要に応じて変更することで、デフォルトをXAMLマークアップにコピーできます。 – mm8
ありがとう、これは私に必要なものを手に入れました。 – sclarke81