如果Adorner直接显示在WPF控件的顶部,如何处理WPF中的MouseEnter和MouseLeave事件?

时间:2019-06-17 19:06:14

标签: c# wpf mouseevent mouseenter adorner

我在WPF应用程序中有一个ListView,我想通过自定义Adorner向每个ListViewItem添加带有一些按钮的网格。当前,当为ListViewItem触发MouseEnter事件时,例如,将添加装饰器。当我将鼠标移到ListViewItem中时,以及当ListViewItem发生MouseLeave事件时将其删除。但是,这会导致MouseEnter / MouseLeave事件的循环,因为添加Adorner时,它将导致Adorner成为鼠标的焦点,而不是ListViewItem。换句话说,一旦添加了Adorner,由于从ListViewItem触发的MouseLeave事件,将其立即删除。

我已经看到一些有关将“ IsHitTestVisible = false”属性添加到Adorner的建议,但是我需要能够捕获Adorner中按钮上的点击事件。

简短的崇拜者阶层


private readonly VisualCollection visualChildren;
private Grid adornerGrid;

public ListViewItemOptionsAdorner(UIElement adornedElement): base(adornedElement)
{
    visualChildren = new VisualCollection(this);
    adornerGrid = new Grid();
    Button editButton = new Button();
    Button deleteButton = new Button();

    adornerGrid.Children.Add(editButton);
    adornerGrid.Children.Add(deleteButton);

    visualChildren.Add(adornerGrid);

    MouseEnter += ListViewItemOptionsAdorner_MouseEnter;
    MouseLeave += ListViewItemOptionsAdorner_MouseLeave;

}

private void ListViewItemOptionsAdorner_MouseEnter { }

private void ListViewItemOptionsAdorner_MouseLeave { }

ListView的主窗口功能

private void List_MouseEnter(object sender, MouseEventArgs e)
{
    ListViewItem listItem = sender as ListViewItem;
    AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(listItem);
    myAdornerLayer.Add(new ListViewItemOptionsAdorner(listItem));

    e.Handled = true;
}

private void List_MouseLeave(object sender, MouseEventArgs e)
{
    ListViewItem listItem = sender as ListViewItem;

    if (!listItem.IsMouseOver)
    {
        AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(listItem);
        Adorner[] adorners = myAdornerLayer.GetAdorners(listItem);
        for (int i = 0; adorners.Length; i++)
            myAdornerLayer.Remove(adorners[i]);
        e.Hanlded = true;
    }
}

发生的事情只是装饰者闪烁的连续循环,但是我希望当鼠标悬停在ListViewItem上时显示它,而当不在ListViewItem上时隐藏它。

0 个答案:

没有答案