我有listbox
。 listbox
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
但仍无法找到解决方案。因此,请帮助我从双击中获取元素类型或元素名称。
答案 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
)