24

ユーザー インターフェイス レベルから見ると比較的単純でロジックに見えることをしようとしていますが、非常に厄介なバグが 1 つあります。私は を持っていて、ボタンがトグルされたときに を表示し、ボタンがトグルされたときに を非表示にToggleButtonしようとしています。また、ユーザーがクリックして離れたときにも非表示になります。PopupPopupPopup

Popupが表示された後にトグルボタンをクリックすると、一瞬Popup消えてから再び表示されることを除いて、すべてが次の XAML で期待どおりに機能しています。

ここで起こっていることは、マウスをクリックするとボタンがオンに切り替わった直後に、 から離れてクリックするとPopupボタンがオフに切り替わることであると思われます。私はそれを修正する方法を知りません。

どんな助けでも大歓迎です。ありがとう。

    <ToggleButton x:Name="TogglePopupButton" Content="My Popup Toggle Button" Width="100" />

    <Popup StaysOpen="False" IsOpen="{Binding IsChecked, ElementName=TogglePopupButton, Mode=TwoWay}">
        <Border Width="100" Height="200" Background="White" BorderThickness="1" BorderBrush="Black">
            <TextBlock>This is a test</TextBlock>
        </Border>                
    </Popup>
4

4 に答える 4

40

Stephansの回答には、フォーカスを失うたびにポップアップを閉じるという望ましい動作も失われるという欠点があります。

ポップアップが開いているときにトグルボタンを無効にすることで解決しました。別の方法は、有効にする代わりにIsHitTestVisibleプロパティを使用することです。

    <ToggleButton x:Name="TogglePopupButton" Content="My Popup Toggle Button" Width="100"  IsEnabled="{Binding ElementName=ToggledPopup, Path=IsOpen, Converter={StaticResource BoolToInvertedBoolConverter}}"/>
    <Popup x:Name="ToggledPopup" StaysOpen="False" IsOpen="{Binding IsChecked, ElementName=TogglePopupButton, Mode=TwoWay}">
        <Border Width="100" Height="200" Background="White" BorderThickness="1" BorderBrush="Black">
            <TextBlock>This is a test</TextBlock>
        </Border>                
    </Popup>

コンバーターは次のようになります。

public class BoolToInvertedBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            bool boolValue = (bool)value;
            return !boolValue;
        }
        else
            return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException("ConvertBack() of BoolToInvertedBoolConverter is not implemented");
    }
}
于 2013-01-10T11:55:20.027 に答える
-1

StaysOpen="True"あなたのために設定Popup

MSDNから:

コントロールがフォーカスされなくなったときに Popup コントロールを閉じるかどうかを示す値を取得または設定します。

[...]

trueプロパティが に設定されているPopupときにコントロールが閉じる場合。IsOpenfalse

falsePopupコントロールの外でマウスまたはキーボードのイベントが発生したときにコントロールが閉じる場合Popup

于 2013-01-10T06:45:39.753 に答える