wpf中控件的实例位置和访问说明符是什么?

What is the instance location and access specifier of the control in wpf?

例如新建一个wpf项目,在MainWindow.xaml文件中添加如下代码

<Grid>
   <Button x:Name="buttonControl" Content="Button" Margin="332,145,0,0" Width="75"/>
   <local:UserControl1/>
</Grid>
  1. 这里,MainWindow.xaml和MainWindow.xaml.cs(code behind)是一个对象,Button(wpf标准控件)和UserControl1(用户控件)的实例被创建为属于MainWindow对象.我理解正确吗?
  2. 而且控件的默认访问修饰符好像是public,我应该这样指定吗?
<Grid>
   <Button x:Name="buttonControl" x:FieldModifier="Private" Content="Button" Margin="332,145,0,0" Width="75"/>
   <local:UserControl1 x:FieldModifier="Private" />
</Grid>

这是基本用法吗?

您必须区分 class 访问修饰符和 XAML 元素引用访问修饰符。 XAML 定义对象的可见性由其 namescopes 定义。这意味着属于 UserControl 的控件在控件外部不直接可见或不可访问。

如果您使用 x:Name 指令为控件命名,那么编译器将在部分 class 中创建一个 internal 字段,该字段引用命名元素 (实例)。默认情况下,只能通过在 internal 范围内限定部分 class 来引用此字段。如果您希望该字段在 public 范围内可访问,您可以使用 x:FieldModifier 属性来调整该字段的可见性。这就是 x:FieldModifier 属性的用途。

您只需关心 class 修饰符而不是 UI 元素字段引用。
如果对象本身未定义 public,则无法创建它的实例或引用它,例如,对于可见性之外的类型转换。

但是因为你想在 XAML 中允许实例化 Screen,它 必须 包含一个 public 默认构造函数并且必须有一个public 可见度。如果你想禁止 subclassing 你可以 seal 类型:

public sealed class Screen
{
  public Screen()
  {}
}

如果设计用于 public,那么定义 Screen internal 毫无意义。这应该是显而易见的。