3

ここで何が起こっているのでしょうか?また、回避策を実行するにはどうすればよいですか?

  1. MyToggleButton を押します。これで、瞬時に押された (チェックされた) ように見えます。
  2. 同時に、MyToggleButton_Checked ハンドラーは MyToggleButton を無効にします。
  3. 非トグル ボタン '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;
}

しかし、テンプレートの置換の瞬間にコントロールがちらつきます。

4

1 に答える 1

6

それが問題に対する私の解決策です。ここにビデオ、使用法があります:

<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;
    }
}
于 2012-04-07T08:59:01.803 に答える