2012-04-04 50 views
3

這裏發生了什麼,以及如何做一個解決方法?WPF ToggleButton不正確的渲染行爲

  1. 按MyToggleButton。現在看起來像立即按下(選中)。
  2. 與此同時MyToggleButton_Checked處理程序禁用MyToggleButton。
  3. 現在按非切換按鈕「啓用」。我們看到了什麼? 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; 
} 

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位.NET 4.效果依然如此。 – frtnum 2012-04-04 15:59:31

+0

效果取決於活動主題。至少在我的機器上。經典主題就像它應該那樣工作。簡單的主題和航空主題工作不恰當。這裏是我錄製的視頻,整個上傳大小爲3.1 Mb:http://screencast.com/t/KLCIwo9whs – frtnum 2012-04-04 16:47:32

回答

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 2016-02-08 02:28:55