2010-02-07 116 views
7

我正在嘗試將應用程序從silverlight移植到wpf。 Unfortunatley我對這兩個都很陌生。在WPF中是否存在以下Silverlight代碼的等價物?WPF等效於Silverlight「RootVisual」

 private static Canvas GetCanvas() 
     { 
      var uc = Application.Current.RootVisual as UserControl; 
      if (uc == null) 
      { 
       return null; 
      } 
      return uc.FindName("ChoiceCanvas") as Canvas; 
     } 

目前我使用

Application.Current.MainWindow.FindName("ChoiceCanvas") as Canvas; 

但是這不工作,也許是因爲ChoiceCanvas是一些位於用戶控件,而不是在主窗口?

回答

1

由於Canvas存在於UserControl的名稱範圍中,因此FindName將無法工作,請嘗試使用LogicalTreeHelper來代替。

var canvas = LogicalTreeHelper.FindLogicalNode(
     Application.Current.MainWindow, "ChoiceCanvas") as Canvas; 
10

WPF中沒有RootVisual屬性。據我瞭解,「窗口」是「根」。您可以通過運行靜態方法Window myWindow = Window.GetWindow(myControl)來獲取任何WPF(D.O.)對象所屬的Window;

1

當前窗口是根視覺。

從MSDN WPF Graphics Rendering Overview

根視覺處於視覺樹層次結構的最頂層元素。在大多數應用程序中,根視覺的基類是窗口 或NavigationWindow。但是,如果您在Win32應用程序中託管可視對象,則根視覺效果將是您在Win32窗口中託管的最高視覺效果。有關更多信息,請參閱教程: 在Win32應用程序中承載可視對象。