我在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上时隐藏它。