TL;DR
大多数时候您不需要在 WPF 中担心这个问题。然而:
- 如果您使用以下方式命名 XAML 元素x:Name属性,那么你可以使用x:字段修改器属性来控制表示该元素的自动生成字段的可见性。该属性值是特定于语言和大小写的。
- 如果您没有命名 XAML 元素,则不必费心使用x:字段修改器属性。
请继续阅读以获取更详细的解释。
显式命名和生成字段
如果您在 Visual Studio 中创建一个新的 WPF 应用程序项目,它将创建一个主窗口类,其 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 资源管理器,您会发现一个名为主窗口.g.cs:这个文件包含 IDE 从 XAML 生成的代码(它基本上相当于*.Designer.cs来自 WinForms 的文件)。
你的窗户有一个Grid其上,但请注意,它没有直接出现在代码中的任何位置主窗口。现在编辑您的 XAML 以给出Grid a name:
<Grid x:Name="_myGrid">
编译应用程序,然后打开主窗口.g.cs再次归档。您将看到添加了以下行:
internal System.Windows.Controls.Grid _myGrid;
设置x:NameXAML 中元素的属性导致代码生成器添加具有该名称的字段。该字段被标记为internal
这意味着项目中的所有类型都可以访问它,但引用您项目的任何其他项目都无法访问它。
所以基本上,如果您没有使用 XAML 显式命名元素x:Name属性,代码生成器不会为代码隐藏类中的元素创建命名字段,并且您的元素将有效地private
(这意味着类本身也不能直接访问该元素)。
仍然可以从代码访问无名 UI 元素(如果您有实例)
没有名称的元素仍然可以通过代码访问,通过“遍历”可视化树Window实例。例如,因为窗口的内容设置为单个Grid元素,您可以通过如下代码访问该网格:
Grid grid = (Grid) this.Content;
this
这里指的是主窗口类实例。
WinForms 在这方面与 WPF 有着完全相同的“问题”:即使没有显式命名的控件仍然可以通过代码访问。想象一下 WinFormsForm与单个Button对其进行控制。您可以像这样访问该按钮:
Button button = (Button) this.Controls[0];
事实上该按钮有一个默认值修饰符“Private”的值并没有阻止代码访问它。
FieldModifier 属性控制生成的字段可见性
回到 WPF,特别是如果您使用模型-视图-视图模型 (MVVM) 模式,您很少需要在 XAML 中显式命名元素,因此默认行为就可以了。但是,如果您确实发现需要命名 XAML 元素,并且希望“隐藏”这些元素,那么您可以使用x:字段修改器属性将元素的可见性设置为private
而不是默认的internal
。用于属性的值取决于语言且区分大小写,例如。对于 C#:
<Grid x:Name="_myGrid" x:FieldModifier="private">