24

我正在尝试做一些从用户界面级别看起来相对简单和逻辑的事情,但我有一个非常烦人的错误。我有一个ToggleButton,我试图在Popup切换按钮时显示一个,并在切换按钮时隐藏Popup。当Popup用户点击离开它时,它也会隐藏。

以下 XAML 的一切都按预期工作,除非我在显示后单击切换按钮PopupPopup然后消失一瞬间然后重新出现。

我怀疑这里发生的事情是点击离开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 回答
25

没有 IValueConverter 的解决方案:

<Grid>
    <ToggleButton x:Name="TogglePopupButton" Content="My Popup Toggle Button" Width="100" >
        <ToggleButton.Style>
            <Style TargetType="{x:Type ToggleButton}">
                <Setter Property="IsHitTestVisible" Value="True"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=Popup, Path=IsOpen}" Value="True">
                        <Setter Property="IsHitTestVisible" Value="False"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ToggleButton.Style>
    </ToggleButton>

    <Popup StaysOpen="false" IsOpen="{Binding IsChecked, ElementName=TogglePopupButton, Mode=TwoWay}"
               PlacementTarget="{Binding ElementName=TogglePopupButton}" PopupAnimation="Slide" 
           x:Name="Popup">
        <Border Width="100" Height="200" Background="White" BorderThickness="1" BorderBrush="Black">
            <TextBlock>This is a test</TextBlock>
        </Border>
    </Popup>
</Grid>
于 2015-12-24T12:48:09.957 回答
1

在 ToggleButton 上设置属性ClickMode="Press"apixeltoofar

于 2017-04-27T21:06:44.670 回答
-1

StaysOpen="True"为您设置Popup

来自MSDN

获取或设置一个值,该值指示当控件不再处于焦点时是否关闭 Popup 控件。

[...]

true如果控件在属性设置Popup为时关闭;IsOpenfalse

false如果在Popup控件外部发生鼠标或键盘事件时控件关闭Popup

于 2013-01-10T06:45:39.753 回答