gpt4 book ai didi

c# - WPF 窗口如何知道如何访问嵌套元素?

转载 作者:行者123 更新时间:2023-11-30 20:49:35 26 4
gpt4 key购买 nike

我有以下有效的 XAML 代码:

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

在相应的 C# 代码中,静态回调方法(对于名为 Sides 的属性)按如下方式访问 poly 元素:

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

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

如何通过Window1 win直接访问polypoly 嵌套在 Grid 元素中(尽管没有命名)。这种类型的访问是 WPF 的一项功能吗?

PS:我知道需要通过一个对象来访问(因为方法是静态的),就是嵌套,我不明白。

最佳答案

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

但是WPF有Namescopes的概念这使得在多个范围内使用相同的名称成为可能。

Styles and templates in WPF provide the ability to reuse and reapply content in a straightforward way. However, styles and templates might also include elements with XAML names defined at the template level. That same template might be used multiple times in a page. For this reason, styles and templates both define their own XAML namescopes, independent of whatever location in an object tree where the style or template is applied.

在下面的简单 XAML 中,您有一个名为 gridGrid,其中包含一个名为 listBoxListBox。在从 XAML 生成的类中,有名为 gridlistBox 的字段,允许后面的代码访问这两个控件。

ItemTemplate 生成的每个列表框项目都包含一个名为 textBlockTextBlock。但是,每个列表框项目都在一个单独的名称范围中,并且在从 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 对象。但是,在更高级的场景中,您可能希望引用模板中的命名元素,例如在触发器中。

关于c# - WPF 窗口如何知道如何访问嵌套元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23424640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com