如何将控件标记为“私人”'在WPF?

时间:2015-04-08 21:48:43

标签: c# wpf private

使用WinForms程序,我已经习惯于将控件的Modifiers属性标记为“Private”,以防止外部类和其他任何让你无法看到和搞乱它们。

在WPF中仍然非常绿色,我发现在WPF中没有明显的等价物允许我这样做,所以外部类无法看到我放到表单或其他用户控件上的控件或者什么不能。我注意到了一些x:FieldModifier =“Private”但是我收到错误“x:FieldModifier =”Private“对于语言C#”无效。

如何将控件标记为“私有”,以便外部类对象无法查看或访问它?

1 个答案:

答案 0 :(得分:15)

  

<强> 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 的文件:这个文件包含由来自XAML的IDE(它基本上相当于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(这意味着类本身也不能直接访问元素)。


仍然可以从代码

访问无名UI元素

然而,您应该记住,仅仅因为元素没有名称并不意味着它不能通过代码访问。您始终可以“遍历”可视树并以这种方式访问​​元素。例如,因为窗口的内容设置为单个 Grid 元素,所以您可以通过以下代码访问该网格:

Grid grid = (Grid) this.Content;

this指的是 MainWindow 类实例。

在这方面,WinForms与WPF具有完全相同的“问题”:即使是未明确命名的控件仍然可以通过代码访问。想象一下WinForms 表单,上面有一个 Button 控件。您可以像这样访问该按钮:

Button button = (Button) this.Controls[0];

按钮的默认修饰符值为“私有”这一事实并未阻止代码访问它。


FieldModifier属性控制生成的字段可见性

回到WPF,特别是如果你使用的是Model-View-ViewModel(MVVM)模式,你很少需要在XAML中明确命名你的元素,因此默认行为就没问题了。但是,如果您确实发现需要命名XAML元素,并希望“隐藏”这些元素,则可以使用 x:FieldModifier 属性将元素的可见性设置为{ {1}}而不是默认的private。用于该属性的值是语言相关的并且区分大小写,例如。对于C#:

internal