簡體   English   中英

如何將 XAML 文件(視圖)轉換為 DependencyObject?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM