10

トグルボタンとポップアップを含むコントロールがあります。ToggleButtonをクリックすると、ポップアップが表示されます。ToggleButtonのチェックを外すと、ポップアップが閉じます。さらに、ポップアップから離れてクリックするとポップアップが閉じ、トグルボタンのチェックが外れます。

これを設定するには、ポップアップのStaysOpenプロパティをfalseに設定し、トグルボタンのIsCheckedプロパティをポップアップのIsOpenプロパティに双方向でバインドするように設定します。

1つのケースを除いて、すべてが順調です。ボタンがオンになっていてポップアップが開いている場合、ボタンをクリックしてもポップアップが閉じたり、ボタンがオフに戻ったりすることはありません。

これは、ボタンをクリックすると、ポップアップのStaysOpenロジックがポップアップのIsOpenプロパティをfalseに設定するためであると考えられます。次に、これによりTogglebuttonがオフに設定されます。これは、ボタンのクリックが処理される前に発生する必要があります。したがって、クリックによってボタンが再チェックされます。つまり、競合状態です。

どうすれば私が望む行動をとることができるか考えていますか?

4

3 に答える 3

10

仮定が正しければ、次のようなカスタムポップアップクラスが必要になります。

public class MyPopup : Popup {
    protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) {
        bool isOpen = this.IsOpen;
        base.OnPreviewMouseLeftButtonDown(e);

        if (isOpen && !this.IsOpen)
            e.Handled = true;
    }
}

!this.IsOpenifステートメントからを削除する必要がある場合があります。代わりにMyPopupを使用すると、MouseLeftButtonDownイベントがToggleButtonに到達できなくなります。

于 2011-04-28T16:20:52.140 に答える
7

上記の両方の解決策には問題があります。バインディングの代わりにイベントハンドラーを使用する別のソリューションがありますが、MyPopupソリューションでsvickが指摘したクリックロストの問題とClickMode=Pressの問題を回避します。xamlは次のようになります。

<ToggleButton Name="OptionsButton" Checked="OptionsButton_OnChecked" Unchecked="OptionsButton_OnUnchecked" />
<Popup Name="OptionsPopup" StaysOpen="False" Closed="OptionsPopup_OnClosed"/>

そしてコード:

    void OptionsPopup_OnClosed(object sender, EventArgs e)
    {
        if (OptionsButton != Mouse.DirectlyOver)
            OptionsButton.IsChecked = false;
    }

    void OptionsButton_OnChecked(object sender, RoutedEventArgs e)
    {
        OptionsPopup.IsOpen = true;
    }

    void OptionsButton_OnUnchecked(object sender, RoutedEventArgs e)
    {
        OptionsPopup.IsOpen = false;
    }
于 2013-11-05T14:26:46.963 に答える
1

解決策は、ポップアップのIsOpenプロパティとToggleButtonのIsCheckedプロパティの間にTwoWayバインディングを設定することです。次に、ToggleButtonのClickModeプロパティPressに設定します。出来上がり!

于 2012-11-19T10:28:03.420 に答える