为什么默认情况下 WPF 控件不是私有的?



在 WPF 中,写入

<TextBlock x:Name="foo"/>

将使控制public。要使其private,必须显式指定FieldModifier

<TextBlock x:Name="foo" x:FieldModifier="private"/>

我觉得这很奇怪。我认为直接从类外部访问子控件不是一种好的编码风格。例如,我会避免写作

var muc = new MyUserControl();
muc.foo.Text = "foo";

相反,我会编写一个公共方法并使用它:

public void SetFooText(string text) { foo.Text = text; }
// in somewhere else
var muc = new MyUserControl();
muc.SetFooText("foo");

或编写公共属性

public string FooText 
{ 
    get { return foo.Text; } 
    set { foo.Text = value; } 
}
// in somewhere else
var muc = new MyUserControl();
muc.FooText = "foo";

因此,我真的没有看到默认情况下将控件设置为public的任何优势。如果private是默认值,就像 C# 中的所有内容一样,也许会更安全。

为什么public是默认值?

编辑:

好吧,我犯了一个错误。默认值是internal,正如其他人所提到的。但为什么它不private的问题仍在等待答案。

C# 的 x:FieldModifier 的默认值为 NotPublic(Internal(

TypeAttributes.NotPublic 是默认行为,因为编译 XAML 的程序外部的代码很少需要访问 XAML 创建的元素。WPF 安全体系结构和 XAML 编译行为不会将存储元素实例的字段声明为公共字段,除非您专门将 x:FieldModifier 设置为允许公共访问。

正如我们所看到的,默认情况下,编译 XAML 的程序集是否是私有的,将无法访问 XAML 创建的元素。

您可以在此处找到更多信息 MSDN