2016-09-20 52 views
-1

我上一個項目,我有一個基於在MVVM模式框架來處理導航工作從而獲得元素名稱X:幀的類型名稱,我們必須主窗口轉換成的DependencyObject這樣的..如何將XAML文件(視圖)轉換爲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; 
     } 

在導航服務類別I ...

var frame = GetDescendantFromName(Application.Current.MainWindow, "FrameName") as Frame; 
frame.source = new Uri("Views/StudentView.Xaml"); 

該技術僅限於主窗口。當我通過EmployeeDetailView.Xaml的新instence作爲depenecy對象,XAML文件未加載和GetChildrenCount()返回0

var frame = GetDescendantFromName(EmployeeDetaiView.Xaml, "FrameName") as Frame; 

這裏框架具有值。 我如何使它與當前呈現的EmployeeDetailView一起工作來獲取Frame元素?

+0

將視圖實例作爲第一個參數傳遞給您的方法?問題究竟在哪裏? – Clemens

+0

_「這種技術僅限於MainWindow」_ - 爲什麼?是什麼讓你這麼說?如果你有任何其他視圖的引用,爲什麼你不能只是將該引用傳遞給同一個方法,來遍歷該視圖的視覺樹並檢索感興趣的元素?更重要的是,爲什麼你有這個方法呢?你爲什麼不直接調用['FrameworkElement.FindName()'](https://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.findname(v = vs.110).aspx) ? –

+0

請提供一個很好的[mcve],清楚地表明你想要做什麼,並詳細解釋代碼的作用,以及你希望它做什麼。 –

回答

-1

使用Application.LoadComponent Method (Uri)

Page p = (Page) Application.LoadComponent(new Uri("Views/EmployeeDetaiView.Xaml.xaml", UriKind.Relative)); 

var ctrl = GetDescendantFromName(p, "SomeControl"); 

這裏,EmployeeDetaiView.Xaml在於瀏覽文件夾。用戶後

編輯#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); 
    } 
+0

這解決了局部部分問題,通過這樣做VisualTreeHelper.GetChildrenCount()返回0 :( – Abdullah