如何使用WPF中的VisualTreeHelper在WPF中查找父级visual?
新手问题。我需要爬上wpf xaml的可视化树,直到找到x:Name FindMe的父网格。假设我有一个名为grid的FindMe的可视化子级,也是一个grid,我将如何在F中使用VisualTreeHelper如何使用WPF中的VisualTreeHelper在WPF中查找父级visual?,wpf,f#,Wpf,F#,新手问题。我需要爬上wpf xaml的可视化树,直到找到x:Name FindMe的父网格。假设我有一个名为grid的FindMe的可视化子级,也是一个grid,我将如何在F中使用VisualTreeHelper let parent = VisualTreeHelper.GetParent(grid) as Grid <-- clearly wrong! 提前感谢您的建议 F中没有as运算符,但您可以尝试以下操作: let parent = VisualTreeHelper.Get
let parent = VisualTreeHelper.GetParent(grid) as Grid <-- clearly wrong!
提前感谢您的建议 F中没有as运算符,但您可以尝试以下操作:
let parent = VisualTreeHelper.GetParent(grid)
if parent :? Grid then
...
else
...
F中没有as运算符,但您可以尝试以下操作:
let parent = VisualTreeHelper.GetParent(grid)
if parent :? Grid then
...
else
...
您可以引入一些类型扩展来爬升可视化树父层次结构,然后使用它们搜索具有指定名称的父级 首先定义:
let inline isNull (x:^T when ^T : not struct) = obj.ReferenceEquals (x, null)
type DependencyObject with
member t.GetVisualParents() =
t |> Seq.unfold (fun state -> if isNull state then None else Some(state, VisualTreeHelper.GetParent(state)))
|> Seq.skip(1)
member t.GetVisualParents<'T when 'T :> DependencyObject>() =
System.Linq.Enumerable.OfType<'T>(t.GetVisualParents())
member t.GetVisualParentByName<'T when 'T :> FrameworkElement>(name) =
t.GetVisualParents<'T> ()|> Seq.filter (fun x -> x.Name = name) |> Seq.tryHead
然后你可以做:
let name = "FindMe"
let parent = grid.GetVisualParentByName<Grid>(name)
注:
没有类型的序号,所以我只使用了。有关其他选项,请参见和
于年引进。如果您使用的是早期版本,则可以使用from System.Linq
您可以引入一些类型扩展来爬升可视化树父层次结构,然后使用它们搜索具有指定名称的父级 首先定义:
let inline isNull (x:^T when ^T : not struct) = obj.ReferenceEquals (x, null)
type DependencyObject with
member t.GetVisualParents() =
t |> Seq.unfold (fun state -> if isNull state then None else Some(state, VisualTreeHelper.GetParent(state)))
|> Seq.skip(1)
member t.GetVisualParents<'T when 'T :> DependencyObject>() =
System.Linq.Enumerable.OfType<'T>(t.GetVisualParents())
member t.GetVisualParentByName<'T when 'T :> FrameworkElement>(name) =
t.GetVisualParents<'T> ()|> Seq.filter (fun x -> x.Name = name) |> Seq.tryHead
然后你可以做:
let name = "FindMe"
let parent = grid.GetVisualParentByName<Grid>(name)
注:
没有类型的序号,所以我只使用了。有关其他选项,请参见和
于年引进。如果您使用的是早期版本,则可以使用from System.Linq
只需递归调用VisualTreeHelper.GetParent,直到找到它为止
let rec getParent dp =
match VisualTreeHelper.GetParent dp with
| null -> None
| :? Grid as grid when grid.Name = "FindMe" -> Some grid
| parent -> getParent parent
显然,通过传入您要查找的控件的类型和名称,可以使此函数更通用。只需递归调用VisualTreeHelper.GetParent,直到找到它为止
let rec getParent dp =
match VisualTreeHelper.GetParent dp with
| null -> None
| :? Grid as grid when grid.Name = "FindMe" -> Some grid
| parent -> getParent parent
显然,通过传入您要查找的控件的类型和名称,可以使此函数更通用