在WPF中使用Popup.StaysOpen鼠标单击时隐藏弹出窗口

时间:2010-02-22 01:45:42

标签: wpf popup

我的UserControl包含:

  • 按钮
  • 弹出窗口(包含文本块)

XAML

<UserControl>
<button Name="btnShowPopup" Content="Button" Click="Button_Click"/>
<Popup Name="popup" StaysOpen="true">
<TextBlock Text="Popup"/>
</Popup>
</UserControl>

Code Behide

private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
   this.popup.IsOpen=!this.popup.IsOpen;
}

问题:当鼠标点击btnShowPopup按钮外的任何地方时,我想隐藏弹出窗口。

注意:我尝试更改StaysOpen="false"btnShowPopup.MouseDown事件: this.popup.IsOpen=!this.popup.IsOpen; 但是这个解决方案会导致另一个问题:当btnShowPopup.MouseUp事件时,Popup会消失。

请帮忙。

4 个答案:

答案 0 :(得分:4)

您还可以在togglebutton:

上绑定StaysOpen属性
StaysOpen="{Binding ElementName=toggleButton,Path=IsMouseOver}"

https://social.msdn.microsoft.com/Forums/vstudio/en-US/f0502813-9c4f-4b45-bab8-91f98971e407/popup-popupstaysopen-togglebutton-and-data-binding-helpful-tip?forum=wpf

对我来说问题是,如果我双击我的数据网格,它在弹出窗口中,弹出窗口直接打开,那就是我使用多重绑定的原因。 我做了什么:

我在IsMouseOver toggleButton和我的IsMouseOver数据网格上的StayOpen属性绑定了弹出窗口。

<Popup.StaysOpen>
    <MultiBinding Converter="{StaticResource MultiBinding_StayOpen}">
        <Binding ElementName="toggleButton"  Path="IsMouseOver"/>
        <Binding ElementName="dtg_loc" Path="IsMouseOver" />
    </MultiBinding>
</Popup.StaysOpen>

multiBindingConverter:

public class MultiBinding_StayOpen : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

        bool toggleIsMouseOver;
        bool datagridIsMouseOver;

        toggleIsMouseOver = System.Convert.ToBoolean(values[0]);
        datagridIsMouseOver = System.Convert.ToBoolean(values[1]);


        if (toggleIsMouseOver == false && datagridIsMouseOver == false)
            return false;

        if (toggleIsMouseOver == true && datagridIsMouseOver == false)
            return true;

        if (toggleIsMouseOver == true && datagridIsMouseOver == true)
            return false;

        return true;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

希望有所帮助:-)

答案 1 :(得分:3)

我会尝试更多WPF式的方法。我会尝试绑定属性,而不是执行代码。如果您更改ToggleButton的Button,则很容易。你看,ToggleButton有一个名为IsChecked的布尔属性

<ToggleButton x:Name="myToggle" />
<Popup x:Name="Popup"
    IsOpen="{Binding Path=IsChecked, ElementName=myToggle}"
    Placement="Right"
    PlacementTarget="{Binding ElementName=myToggle}"
    AllowsTransparency="True" 
    Focusable="False"
    PopupAnimation="Fade"
    StaysOpen="False">
    <Textblock Text="Here goes my content" />
</Popup>

您怎么看?

答案 2 :(得分:3)

在切换按钮上设置属性ClickMode="Press"

<ToggleButton x:Name="myToggle" ClickMode="Press" />

答案 3 :(得分:2)

氧化钛。 这也是我正在尝试的解决方案。但是它有两个问题。

1)当您按下按钮时,弹出窗口会打开,但是如果再次按下该按钮,弹出窗口将关闭,然后再次快速打开。这不是我预期的行为,我认为它会再次关闭。

2)如果您远离切换按钮,则弹出窗口保持打开状态。

我用Google搜索了一下,当然其他一些人遇到了同样的问题,并解决了它:=)

检查一下: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/f0502813-9c4f-4b45-bab8-91f98971e407