x:ClassModifier Directive
Modifies XAML compilation behavior when x:Class
is also provided. Specifically, instead of creating a partial class
that has a Public
access level (the default), the provided x:Class
is created with a NotPublic
access level. This behavior affects the access level for the class in the generated assemblies.
XAML Attribute Usage
<object x:Class="namespace.classname" x:ClassModifier="NotPublic">
...
</object>
XAML Values
Value | Description |
---|---|
NotPublic | The exact string to pass to specify TypeAttributes.Public versus TypeAttributes.NotPublic varies, depending on the code-behind programming language that you use. See Remarks. |
Dependencies
x:Class must also be provided on the same element, and that element must be the root element in a page. For more information, see [MS-XAML] Section 6.3.1.8.
Remarks
The value of x:ClassModifier
in .NET XAML Services usage varies by programming language. The string to use depends on how each language implements its CodeDomProvider and the type converters it returns to define the meanings for TypeAttributes.Public and TypeAttributes.NotPublic, and whether that language is case sensitive.
For C#, the string to pass to designate TypeAttributes.NotPublic is
internal
.For Microsoft Visual Basic .NET, the string to pass to designate TypeAttributes.NotPublic is
Friend
.For C++/CLI, no targets exist that support compiling XAML; therefore, the value to pass is unspecified.
You can also specify TypeAttributes.Public (public
in C#, Public
in Visual Basic); however, specifying TypeAttributes.Public is infrequently done because TypeAttributes.Public is already the default behavior.
Other values with equivalent user code access-level restrictions, such as private
in C#, are not relevant for x:ClassModifier
because nested class references are not supported in XAML, and therefore, the TypeAttributes.NotPublic modifier has the same effect.
Security Notes
The access level as declared in x:ClassModifier
is still subject to interpretation by particular frameworks and their capabilities. WPF includes capabilities to load and instantiate types where x:ClassModifier
is internal
, if that class is referenced from a WPF resource through a pack URI reference. As a consequence of this case and potentially others like it implemented by other frameworks, do not rely exclusively on x:ClassModifier
to block all possible instantiation attempts.
See also
.NET Desktop feedback