![](/img/trans.png)
[英]How to convert a DependencyObject into an AutomationElement?
[英]How to Convert XAML File (View) into DependencyObject?
我正在處理一個項目,我必須在 MVVM 模式中處理基於 Frame 的導航,從而獲得元素 Name x:Name 類型 Frame 我們必須像這樣將 MainWindow 轉換為 DependencyObject ..
private static FrameworkElement GetDescendantFromName(DependencyObject parent, string name)
{
var count = VisualTreeHelper.GetChildrenCount(parent);
if (count < 1)
{
return null;
}
for (var i = 0; i < count; i++)
{
var frameworkElement = VisualTreeHelper.GetChild(parent, i) as FrameworkElement;
if (frameworkElement != null)
{
if (frameworkElement.Name == name)
{
return frameworkElement;
}
frameworkElement = GetDescendantFromName(frameworkElement, name);
if (frameworkElement != null)
{
return frameworkElement;
}
}
}
return null;
}
在導航服務類中,我使用...
var frame = GetDescendantFromName(Application.Current.MainWindow, "FrameName") as Frame;
frame.source = new Uri("Views/StudentView.Xaml");
此技術僅限於 MainWindow。 當我將 EmployeeDetailView.Xaml 的新實例作為依賴對象傳遞時,Xaml 文件未加載並且 GetChildrenCount() 返回 0。
var frame = GetDescendantFromName(EmployeeDetaiView.Xaml, "FrameName") as Frame;
這里框架具有空值。 我怎樣才能讓它與當前呈現的 EmployeeDetailView 一起工作來獲取 Frame 元素?
使用Application.LoadComponent 方法 (Uri)
Page p = (Page) Application.LoadComponent(new Uri("Views/EmployeeDetaiView.Xaml.xaml", UriKind.Relative));
var ctrl = GetDescendantFromName(p, "SomeControl");
在這里, EmployeeDetaiView.Xaml
位於 Views 文件夾中。
在用戶評論后編輯 #1
然而,正如 OP 在他的評論中指出的, VisualTreeHelper.GetChildrenCount()
返回 0。發生這種情況是因為p
不是VisualTree
一部分,一旦它成為VisualTree
一部分,它將正常工作。
Page p;
private void Button_Click_1(object sender, RoutedEventArgs e)
{
p = (Page) Application.LoadComponent(new Uri("Views/EmployeeDetaiView.Xaml.xaml", UriKind.Relative));
Frm.Content = p;
// This will print 0
int i = VisualTreeHelper.GetChildrenCount(p);
System.Diagnostics.Debug.WriteLine("Children count = " + i);
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
// Now it will correctly print 1, as 'p' is now part of VisualTree
int i = VisualTreeHelper.GetChildrenCount(p);
System.Diagnostics.Debug.WriteLine("Children count = " + i);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.