ここで何が起こっているのでしょうか?また、回避策を実行するにはどうすればよいですか?
- MyToggleButton を押します。これで、瞬時に押された (チェックされた) ように見えます。
- 同時に、MyToggleButton_Checked ハンドラーは MyToggleButton を無効にします。
- 非トグル ボタン 'Enable' を押します。何が見える?MyToggleButton が有効になっているように見えます。わかった。しかし、待ってください、今はプレスされていないように見えます! どうして?!
XAML:
<StackPanel>
<ToggleButton x:Name="MyToggleButton" Content="MyToggleButton" Checked="MyToggleButton_Checked"/>
<TextBlock Text="{Binding IsChecked, ElementName=MyToggleButton}" Margin="0,4"/>
<Button Name="EnableButton" Content="Enable" Click="EnableButton_Click"/>
<Button Name="DisableButton" Content="Disable" Click="DisableButton_Click"/>
</StackPanel>
分離コード:
void MyToggleButton_Checked(object sender, RoutedEventArgs e)
{
MyToggleButton.IsEnabled = false;
}
void EnableButton_Click(object sender, RoutedEventArgs e)
{
MyToggleButton.IsEnabled = true;
}
void DisableButton_Click(object sender, RoutedEventArgs e)
{
MyToggleButton.IsEnabled = false;
}
更新:
現時点で可能な唯一の回避策は次のとおりです。
void EnableButton_Click(object sender, RoutedEventArgs e)
{
MyToggleButton.IsEnabled = true;
var controlTemplate = MyToggleButton.Template;
var buttonChrome = (Microsoft.Windows.Themes.ButtonChrome)controlTemplate.FindName("Chrome", MyToggleButton);
buttonChrome.RenderPressed = false;
buttonChrome.RenderPressed = true;
}
他にもありますか?
UPD2:
別の回避策は次のとおりです。
void EnableButton_Click(object sender, RoutedEventArgs e)
{
MyToggleButton.IsEnabled = true;
var controlTemplate = MyToggleButton.Template;
MyToggleButton.Template = null;
MyToggleButton.Template = controlTemplate;
}
しかし、テンプレートの置換の瞬間にコントロールがちらつきます。