单击时 WPF 弹出窗口不会关闭

标签 wpf popup

更新: 这是复制链接 https://drive.google.com/file/d/0BzalDCHAtuAPUk5vWF9PVUE2QzQ/view?usp=sharing

回到原来的问题:

我试图在这里找到一些答案,但还没有找到。

我有一个项目集合,其中单击项目时会打开弹出窗口,而在项目外部单击时会关闭弹出窗口。由于某种原因,当打开弹出窗口时,当我再次单击同一项目时,弹出窗口将关闭并重新打开,而不是保持关闭状态。 这是我的代码片段:

一些说明: 我有两个收藏。一个位于 ItemsControl 内,另一个位于 ListView 内。下面的 MouseClickToCommandBehavior 位于 ItemsControl 和 ListView 上。我用它来告诉弹出窗口何时打开和关闭。当我单击项目外部时,我还需要关闭弹出窗口。 目前,当我单击 ListView 或 ItemsControl 内的某个项目(当该项目的弹出窗口已打开时),弹出窗口将重新打开而不是关闭。 出现这种情况是因为 StaysOpen 属性设置为“false”,当我单击项目外部时,需要关闭弹出窗口。

回到原来的问题:

弹出窗口

<Popup IsOpen="{Binding ShowCustomerCardOptionsPopup, UpdateSourceTrigger=PropertyChanged}" StaysOpen="False"
       PlacementTarget="{Binding ElementName=CUstomerCardGrid}"
       Placement="Right">

打开弹出窗口的行为(在 ListView 上设置)

<i:Interaction.Behaviors>
    <behaviors:MouseClickToCommandBehavior Command="{Binding OpenPopupForCustomerCard}" CommandParameter="{Binding ElementName=CustomerCardsListView, Path=SelectedItem}"/>
</i:Interaction.Behaviors>

命令操作

private void OpenPopupForCustomerCardAction(ICustomerModel model)
{
    model.ShowCustomerCardOptionsPopup = !model.ShowCustomerCardOptionsPopup;
}

以及点击同一个项目时的调用堆栈

value: True
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at POS.Models.CustomerModel.set_ShowCustomerCardOptionsPopup(Boolean value)
at POS.ViewModels.CustomerViewModel.OpenPopupForCustomerCardAction(ICustomerModel model)
at POS.InfraStructure.ActionCommand`1.Execute(Object parameter)
at POS.Views.Behaviors.MouseClickToCommandBehavior.AssociatedObject_MouseUp(Object sender, MouseButtonEventArgs e)

====================
value: False
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at POS.Models.CustomerModel.set_ShowCustomerCardOptionsPopup(Boolean value)

====================
value: False
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at POS.Models.CustomerModel.set_ShowCustomerCardOptionsPopup(Boolean value)

====================
value: True
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at POS.Models.CustomerModel.set_ShowCustomerCardOptionsPopup(Boolean value)
at POS.ViewModels.CustomerViewModel.OpenPopupForCustomerCardAction(ICustomerModel model)
at POS.InfraStructure.ActionCommand`1.Execute(Object parameter)
at POS.Views.Behaviors.MouseClickToCommandBehavior.AssociatedObject_MouseUp(Object sender, MouseButtonEventArgs e)

我很想知道为什么“假”值被调用两次 以及如何防止错误或第二个正确的发生(更多 最好是 false 并且仍然具有 StaysOpen="False"的行为)

谢谢

最佳答案

我通过使用按钮打开或关闭弹出窗口时遇到了同样的问题。

我需要在弹出窗口打开时禁用打开/关闭按钮上的 IsHitTestVisible

IsHitTestVisible="{Binding IsOpen, ElementName=MyPopup, Mode=OneWay, Converter={StaticResource InverseBooleanConverter}}"

否则,当单击按钮时,弹出窗口将按照 StaysOpen="False" 的定义关闭。之后,通过单击按钮,它会再次打开。

使用这个简单的转换器(只是为了完整性):

public class InverseBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return !((bool)value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return !((bool)value);
    }
}

关于单击时 WPF 弹出窗口不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36149367/

相关文章:

c# - 如何使 WPF Combobox 的下拉列表保持打开和放置

WPF 弹出窗口夺走了所有者的焦点

javascript - 如果用户评论太快会弹出验证码?

c# - 从一幅图像淡出并淡入另一幅图像

css - 在我的应用程序中使用 facebook 弹出设计

java - 单击时如何复制 SmartGWT 悬停文本的外观/功能

javascript - 滚动条未出现在弹出窗口中

c# - SourceUpdated 和 NotifyOnSourceUpdated 未在 ListBox 中触发

c# - 如何将文本 block 绑定(bind)到 WPF 中的 DataGrid 列的总和?

wpf - 如何更改数据在 WPF GridControl 中的显示方式?