2016-09-20 15 views
-1

私は、私は、このように要素名Xに到達するためにMVVMパターンのフレームに基づいて、ナビゲーションに対処する必要がプロジェクトに取り組んでいます:タイプのフレームの名前は、私たちはこのようにした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; 
     } 
私が使用してナビゲーションサービスクラスで

...

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

この技術は唯一のメインウィンドウに制限されています。 iはdepenecyオブジェクトとしてEmployeeDetailView.Xamlの新しいinstenceを渡すと、XAMLファイルがロードされていないとGetChildrenCount()ここで0

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

を返しフレームはヌル値を有しています。 Frame要素を取得するために現在レンダリングされているEmployeeDetailViewを使用するとどうすればいいですか?

+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は、[ビュー]フォルダにあります。彼のコメントにOPが指し示すように、ユーザーの後

EDIT#1は、

しかしコメントそのVisualTreeHelper.GetChildrenCount()は、それが動作しますVisualTreeの一部である一度pは、VisualTreeの一部ではないため、この問題が発生した0を返します正しく

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() – Abdullah

関連する問題