2012-04-04 17 views
3

ここでは何が起こっているのですか?WPF ToggleButtonのレンダリング動作が正しくありません

  1. MyToggleButtonを押します。今すぐ即座に押された(チェックされた)ように見えます。
  2. 同時に、MyToggleButton_CheckedハンドラはMyToggleButtonを無効にします。
  3. 非トグルボタン「有効」を押します。私たちは何を見ますか? MyToggleButtonは有効になっているように見えます。 OK。しかし、待って、今それは非押されたように見えます!なぜ?!

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; 
} 

UPD:

瞬間にのみ可能な回避策は次のとおりです。

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; 
} 

しかし、コントロールはテンプレート置換の瞬間に点滅している:

別の回避策はあります。問題の私の解決策だ

+0

効果はすべてのマシン上にない表示されるように見えます。私のコンピュータはWindows 7 Professional 64-bit .NETです。4.ここでも効果があります。 – frtnum

+0

効果はアクティブなテーマによって異なります。少なくとも私のマシンで。クラシックのテーマは必要に応じて動作します。シンプルなテーマやAeroテーマは不適切です。ここに私が記録したビデオは、全体のアップロードサイズは3.1Mbでした:http://screencast.com/t/KLCIwo9whs – frtnum

答えて

6

は、ここvideoは、用法です:

<StackPanel> 
    <ToggleButton x:Name="MyToggleButton" Content="MyToggleButton" Checked="MyToggleButton_Checked" 
        l:CorrectToggleButtonCheckedEnableBehavior.IsActive="True"/> 
    <Button Name="EnableButton" Content="Enable" Click="EnableButton_Click"/> 
</StackPanel> 

と添付行動のソースコード:

public static class CorrectToggleButtonCheckedEnableBehavior 
{ 
    public static bool GetIsActive(ToggleButton toggleButton) 
    { 
     return (bool)toggleButton.GetValue(IsActiveProperty); 
    } 

    public static void SetIsActive(ToggleButton toggleButton, bool value) 
    { 
     toggleButton.SetValue(IsActiveProperty, value); 
    } 

    public static readonly DependencyProperty IsActiveProperty = 
     DependencyProperty.RegisterAttached("IsActive", typeof(bool), typeof(CorrectToggleButtonCheckedEnableBehavior), 
     new UIPropertyMetadata(false, OnIsActiveChanged)); 

    static void OnIsActiveChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var toggleButton = (ToggleButton)d; 

     if (GetIsActive(toggleButton)) 
     { 
      toggleButton.IsEnabledChanged += new DependencyPropertyChangedEventHandler(ToggleButton_IsEnabledChanged); 
     } 
     else 
     { 
      toggleButton.IsEnabledChanged -= new DependencyPropertyChangedEventHandler(ToggleButton_IsEnabledChanged); 
     } 
    } 

    static void ToggleButton_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var toggleButton = (ToggleButton)sender; 

     if (toggleButton.IsEnabled && (toggleButton.IsChecked ?? false)) 
     { 
      Invalidate(toggleButton); 
     } 
    } 

    static void Invalidate(ToggleButton toggleButton) 
    { 
     var controlTemplate = toggleButton.Template; 
     toggleButton.Template = null; 
     toggleButton.Template = controlTemplate; 
    } 
} 
+0

これはまさに私と私の同僚が長い間ずっと探していたことです!私はあなたに感謝します。 – user4134476

関連する問題