如何使用WPF中的VisualTreeHelper在WPF中查找父级visual?

如何使用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

新手问题。我需要爬上wpf xaml的可视化树,直到找到x:Name FindMe的父网格。假设我有一个名为grid的FindMe的可视化子级,也是一个grid,我将如何在F中使用VisualTreeHelper

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
显然,通过传入您要查找的控件的类型和名称,可以使此函数更通用