如何识别在ListBox中双击哪个元素?

时间:2016-05-24 03:50:22

标签: c# .net wpf listbox

我有listboxlistbox DataTemplate由少数Text Blocks和一些TextBoxes组成。

问题是鼠标双击我需要找出双击完成的元素,以便进行一些进一步的操作,例如使TextBox可编辑等等。同时我还需要为列表双击定义一些动作。所以我无法单独处理每个组件的鼠标。

因此,我需要为ListBox处理鼠标,并找出双击的元素。

我尝试使用以下代码,但它会返回ListBox的{​​{1}}而不是Name的{​​{1}}:

TextBox

我也尝试了以下问题

WPF Get Element(s) under mouse

How to know what control the mouse has clicked in a canvas?

Getting the Logical UIElement under the mouse in WPF

Name

但仍无法找到解决方案。因此,请帮助我从双击中获取元素类型或元素名称。

1 个答案:

答案 0 :(得分:1)

您可以将FrameworkTemplate.FindName Method (String, FrameworkElement)用于此目的,它可以按您的意愿运行:

private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is childItem)
            return (childItem)child;
        childItem childOfChild = FindVisualChild<childItem>(child);
        if (childOfChild != null)
            return childOfChild;
    }
    return null;
}

然后:

private void LstBox_OnPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    ListBoxItem ListBoxItem = (ListBoxItem)(lstBox.ItemContainerGenerator.ContainerFromIndex(lstBox.SelectedIndex));
    ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(ListBoxItem);
    DataTemplate myDataTemplate = contentPresenter.ContentTemplate;
    StackPanel temp = (StackPanel)myDataTemplate.FindName("myStackPanel", contentPresenter);
    //*so as to do some further operations like make the textbox editable and so on* as you want
   (temp.FindName("field1TextBox") as TextBox).IsReadOnly = false;
}

根据您提出的问题: listbox的{​​{1}}由少数DataTemplate和一些TextBlock 组成。 (我以为他们在TextBoxes

里面