我上一個項目,我有一個基於在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元素?
將視圖實例作爲第一個參數傳遞給您的方法?問題究竟在哪裏? – Clemens
_「這種技術僅限於MainWindow」_ - 爲什麼?是什麼讓你這麼說?如果你有任何其他視圖的引用,爲什麼你不能只是將該引用傳遞給同一個方法,來遍歷該視圖的視覺樹並檢索感興趣的元素?更重要的是,爲什麼你有這個方法呢?你爲什麼不直接調用['FrameworkElement.FindName()'](https://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.findname(v = vs.110).aspx) ? –
請提供一個很好的[mcve],清楚地表明你想要做什麼,並詳細解釋代碼的作用,以及你希望它做什麼。 –