2010-02-07 85 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应用程序中承载可视对象。