在 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