2014-05-02 47 views
2

我有以下工作XAML代码:WPF窗口如何知道如何访问嵌套元素?

static void OnSidesChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
{ 
    Window1 win = obj as Window1; 

    win.poly.Points.Clear(); 
    ... 

操作方法是:

<Window x:Class="DrawShape.Window1" 
    ... 
    <Grid> 
     <Polygon Name="poly"/> 
    </Grid>   
</Window> 

在相应的C#代码,静态回调方法(为一个称为Sides性)如下访问poly元件它是poly访问直接通过Window1 winpoly嵌套在Grid元素中(尽管无名)。这种类型的访问是WPF的一项功能吗? PS:我知道需要通过一个对象进行访问(因为该方法是静态的),这是我不理解的嵌套。

回答

4

您正在混淆WPF逻辑树与如何在XAML中处理名称。在逻辑树中,Polygon包含在Grid中。但是,所有名称都属于相同的范围,并且可用作从XAML生成的类中的字段。

但是,WPF的概念是Namescopes,这使得在多个作用域中使用相同的名称成为可能。

WPF中的样式和模板提供了以直接方式重用和重新应用内容的能力。但是,样式和模板也可能包含具有在模板级别定义的XAML名称的元素。同一个模板可能会在页面中多次使用。出于这个原因,样式和模板都定义了自己的XAML名称范围,与应用样式或模板的对象树中的任何位置无关。

在下面你简单的XAML都包含ListBox名为listBox一个Grid命名为grid。在从XAML生成的类中,存在名为gridlistBox的字段,允许后面的代码访问这两个控件。

ItemTemplate生成的每个列表框项都包含一个名为textBlockTextBlock。但是,每个列表框项目都位于单独的Namescope中,并且从XAML生成的类中没有名为textBlock的字段。

<Grid x:Name="grid"> 
    <ListBox x:Name="listBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock x:Name="textBlock" Text="{Binding Name}"/> 
     </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

在这个简单的例子就没有必要来命名TextBlock对象。但是,在更高级的场景中,你可能想引用模板中的命名元素,例如触发器中。

+0

你是对的,'Window1'命名空间似乎是一个平坦的。我在与第一个“Grid”相同的级别添加了第二个无名的“Grid”,然后尝试添加名为poly的“Polygon”,并且在当前名称范围中出现错误“Name”poly' 。'将检查链接以更好地了解范围。所有这一次,我的印象是有一些层次!谢谢。 – Sabuncu

0

找到您的项目目录中的文件Window1.g.cs

Window1.g.cs包含从您的XAML生成的部分类。在那里你可以找到poly的变量定义。

+1

OP试图了解引擎盖下的内容 –

+0

根据您的建议检查了该文件,这是如何声明poly:内部System.Windows.Shapes.Polygon poly;没有声明封闭的'Grid'。 – Sabuncu

相关问题