TL;DR
在 WPF 中,大多数情况下您无需担心这一点。然而:
- 如果您使用 x:Name 属性命名 XAML 元素,则可以使用 x:FieldModifier 属性来控制自动生成的表示字段的可见性那个元素。此属性值是特定于语言和大小写的。
- 如果您不命名 XAML 元素,请不要使用 x:FieldModifier 属性。
继续阅读以获得更详细的说明。
显式命名和生成的字段
如果您在 Visual Studio 中创建一个新的 WPF 应用程序项目,它将创建一个 MainWindow 类,其 XAML 如下所示:
<Window x:Class="StackOverflow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</Window>
如果您查看此窗口的代码隐藏类,它将如下所示:
// Several using statements...
namespace StackOverflow
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
注意使用partial 关键字将其表示为部分类。如果您使用 Windows 资源管理器导航到项目的 obj\Debug 文件夹,您将找到一个名为 MainWindow.g.cs 的文件:该文件包含由XAML 中的 IDE(它基本上等同于 WinForms 中的 *.Designer.cs 文件)。
您的窗口上有一个Grid,但请注意,它并未直接出现在MainWindow 代码中的任何位置。现在编辑您的 XAML,为 Grid 命名:
<Grid x:Name="_myGrid">
编译应用程序,然后再次打开 MainWindow.g.cs 文件。您将看到已添加以下行:
internal System.Windows.Controls.Grid _myGrid;
在 XAML 中设置元素的 x:Name 属性会导致代码生成器添加具有该名称的字段。该字段标记为internal,这意味着您项目中的所有类型都可以访问它,但引用您项目的任何其他项目都不能访问它。
所以基本上,如果您没有使用 x:Name 属性在 XAML 中显式命名元素,代码生成器将不会为代码隐藏类中的元素创建命名字段,并且您的元素实际上将是private(这意味着该类本身也不能直接访问该元素)。
仍然可以通过代码访问无名 UI 元素(如果您有实例)
仍然可以通过代码访问没有名称的元素,方法是“遍历”Window 实例的可视化树。例如,由于窗口的内容设置为单个 Grid 元素,您可以通过如下代码访问该网格:
Grid grid = (Grid) this.Content;
this 这里指的是 MainWindow 类实例。
WinForms 在这方面与 WPF 有完全相同的“问题”:即使没有明确命名的控件仍然可以通过代码访问。想象一个带有单个 Button 控件的 WinForms Form。您可以像这样访问该按钮:
Button button = (Button) this.Controls[0];
按钮的默认 Modifiers 值为“Private”这一事实并没有阻止代码访问它。
FieldModifier 属性控制生成的字段可见性
回到 WPF,特别是如果您使用模型-视图-视图模型 (MVVM) 模式,您将很少需要在 XAML 中显式命名您的元素,因此默认行为会很好。但是,如果您确实发现需要命名 XAML 元素,并且希望“隐藏”这些元素,则可以使用 x:FieldModifier 属性将元素的可见性设置为 @ 987654331@ 而不是默认的internal。用于属性的值取决于语言且区分大小写,例如。对于 C#:
<Grid x:Name="_myGrid" x:FieldModifier="private">