我正在使用附加属性为wpf实现DragAndDrop-manager。它工作得很好。但是只有一个问题。要抓取拖动的项目,我正在使用visualtree。例如,我想拥有listboxitem,但originalsource是listboxitem的边框。所以我只使用我的一个帮助方法来搜索具有ListBoxItem类型的父类。如果我发现我得到它的数据并拖动它。
但我不想让我的DragAndDrop-manager只在使用列表框时才可用。不,我想在每个Itemscontrol上使用它。 但是一个DataGrid使用DataGridRows,listview使用ListViewItem ......所以有没有机会在没有再次编写代码的情况下获取该项目?
答案 0 :(得分:1)
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
并使用它的某种:
即你想在yourDependencyObjectToSearchIn容器中找到所有TextBox元素
foreach (TextBox txtChild in FindVisualChildren<TextBox>(yourDependencyObjectToSearchIn))
{
// do whatever you want with child of type you were looking for
// for example:
txtChild.IsReadOnly = true;
}
如果你想让我给你一些解释,我会在我起床后立即这样做)
答案 1 :(得分:0)
您可以使用FrameworkElement或UIElement来识别控件。
控制继承层次结构..
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.**FrameworkElement**
System.Windows.Controls.Control
System.Windows.Controls.ContentControl
System.Windows.Controls.ListBoxItem
System.Windows.Controls.**ListViewItem**
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.**FrameworkElement**
System.Windows.Controls.Control
System.Windows.Controls.**DataGridRow**