【问题标题】:Popup for ListView and StaysOpen="False" not working properlyListView 和 StaysOpen="False" 的弹出窗口无法正常工作
【发布时间】:2014-12-15 10:02:20
【问题描述】:

我对弹出窗口的关闭行为感到困惑。一直在搜索论坛,但找不到适合我情况的答案。 我有一个 ListView 和一个用于 ListView 的弹出窗口。单击 ListViewItem 时应打开 Popup,单击其他内容(ListViewItem 除外)时应关闭 Popup。我正在使用 MVVM,因此我已将 Popup 的 IsOpen-Property 绑定到我的 VM 中的一个属性,该属性在绑定到 ListView 的 SelectedItemProperty 的属性中设置。 代码如下所示: MainWindow.xaml

<Grid>
    <ListView Name="List" ItemsSource="{Binding MyList}" SelectedItem="{Binding MyItem}" HorizontalAlignment="Left" />
     <Popup IsOpen="{Binding PopupOpen}" Placement="Right" StaysOpen="False" PlacementTarget="{Binding ElementName=List}">
        <TextBlock Text="I'm a Popup" />
    </Popup>
</Grid>

我的 VM 中的代码如下所示:

public class MyVM
{
    private string myItem;
    private bool popupOpen;

    public MyVM()
    {
        this.MyList = new List<string> { "Item 1", "Item 2", "Item 3" };            
    }

    public List<string> MyList { get; set; }

    public bool PopupOpen
    {
        get
        {
            return this.popupOpen;
        }
        set
        {
            this.popupOpen = value;
            this.OnPropertyChanged();
        }
    }

    public string MyItem
    {
        get
        {
            return this.myItem;
        }

        set
        {
            this.myItem = value;
            this.OnPropertyChanged();

            if (value != null)
            {
                this.PopupOpen = true;
            }
        }
    }
}

就是这样。现在,当我运行这个示例应用程序时,弹出窗口会按预期打开,但只有在整个窗口失去焦点时才会关闭。但是当我单击 ListView 之外的某个位置时,它也应该关闭。

有什么想法吗?

【问题讨论】:

  • 我在您的代码中看不到任何将PopupOpen 设置为false 的执行路径。
  • 它应该会自动关闭。 MSDN:当 StaysOpen 为 false 时,Popup 控件会拦截所有鼠标和键盘事件,以确定这些事件之一何时在 Popup 控件之外发生。
  • @CrazyChief 你搞错了:public class MyVM, Public MainWindow()(看起来像错误的构造函数)
  • @Moti:PoupOpen 默认设置为 false。
  • @deafjeff:应该但它没有;)复制并粘贴我的代码并尝试一下。关于构造函数:更新了我上面的代码示例。是复制和粘贴错误。在我的项目中是正确的。

标签: c# wpf listview popup


【解决方案1】:

好吧,我尝试了所有我想到的东西,比如 MouseCapturing,在 Popup 中播放元素的焦点,从各种事件中打开 Popup(如 PreviewMouseDown、ListItem 的 PreviewMouseUp),但无法获得 StaysOpen功能正常工作。我没有想法,所以我自己实现了所需的 StaysOpen 功能:

为此,我注册了 MainWindow 的 PreviewMouseLeftButtonDown 并在其中处理弹出窗口的关闭,即在单击窗口时关闭所有弹出窗口。为了避免在您单击弹出窗口内部时关闭弹出窗口,我将相同的处理程序添加到弹出窗口并将“IsOpen”-Property 设置回“true”。 丑陋但有效。

因此,如果有人有更好的想法或可以启发我了解 StaysOpen-Property 的内部功能如何真正运作,我将非常高兴 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2015-07-05
    • 2020-02-15
    • 2013-07-07
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多