![](/img/trans.png)
[英]How can I mark a type or member obsolete in an assembly that I do not control?
[英]How do I mark a control as 'Private' in WPF?
使用WinForms程序,我已经习惯于将控件的Modifiers属性标记为“Private”,以防止外部类和其他任何让你无法看到和搞乱它们的东西。
仍然非常绿色的WPF,我发现在WPF中没有明显的等价物允许我这样做,所以外部类无法看到控件我放到表单或其他用户控件或什么不是。 我注意到x的一些东西:FieldModifier =“Private”但我收到错误“x:FieldModifier =”Private“对于C#语言无效”。
如何将控件标记为“私有”,以便外部类对象无法查看或访问它?
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的文件:这个文件包含IDE从XAML生成的代码(它基本上等同于*来自WinForms的.Designer.cs文件)。
您的窗口上有一个网格 ,但请注意,它不会直接显示在MainWindow代码的任何位置。 现在编辑你的XAML给Grid一个名字:
<Grid x:Name="_myGrid">
编译应用程序,然后再次打开MainWindow.g.cs文件。 您将看到添加了以下行:
internal System.Windows.Controls.Grid _myGrid;
在XAML中设置元素的x:Name属性导致代码生成器添加具有该名称的字段。 该字段标记为internal
,这意味着项目中的所有类型都可以访问该字段,但不能访问引用项目的任何其他项目。
所以基本上,如果你没有使用x:Name属性在XAML中明确命名一个元素,代码生成器将不会为代码隐藏类中的元素创建一个命名字段,并且你的元素实际上是private
(这意味着该类本身不能直接访问该元素)。
但是,您应该记住,仅仅因为元素没有名称并不意味着它不能通过代码访问。 您始终可以“遍历”可视树并以这种方式访问元素。 例如,因为窗口的内容设置为单个Grid元素,所以您可以通过以下代码访问该网格:
Grid grid = (Grid) this.Content;
this
指的是MainWindow类实例。
在这方面,WinForms与WPF具有完全相同的“问题”:即使是未明确命名的控件仍然可以通过代码访问。 想象一下,WinForms 表单上有一个Button控件。 您可以像这样访问该按钮:
Button button = (Button) this.Controls[0];
按钮的默认修饰符值为“私有”这一事实并未阻止代码访问它。
返回到WPF,特别是如果您使用的是Model-View-ViewModel(MVVM)模式,您很少需要在XAML中明确命名您的元素,因此默认行为就可以了。 但是,如果您确实发现需要命名XAML元素,并且希望“隐藏”这些元素,则可以使用x:FieldModifier属性将元素的可见性设置为private
而不是默认internal
。 用于该属性的值是语言相关的并且区分大小写,例如。 对于C#:
<Grid x:Name="_myGrid" x:FieldModifier="private">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.