diff --git a/src/Controls/src/SourceGen/CodeBehindGenerator.cs b/src/Controls/src/SourceGen/CodeBehindGenerator.cs index 15ec3eb45a0c..a0d516e2abc9 100644 --- a/src/Controls/src/SourceGen/CodeBehindGenerator.cs +++ b/src/Controls/src/SourceGen/CodeBehindGenerator.cs @@ -123,7 +123,7 @@ static void GenerateXamlCodeBehind(ProjectItem projItem, Compilation compilation return; var uid = Crc64.ComputeHashString($"{compilation.AssemblyName}.{itemName}"); - if (!TryParseXaml(text, uid, compilation, xmlnsDefinitionCache, context.CancellationToken, out var rootType, out var rootClrNamespace, out var generateDefaultCtor, out var addXamlCompilationAttribute, out var hideFromIntellisense, out var XamlResourceIdOnly, out var baseType, out var namedFields, out var parseException)) + if (!TryParseXaml(text, uid, compilation, xmlnsDefinitionCache, context.CancellationToken, out var accessModifier, out var rootType, out var rootClrNamespace, out var generateDefaultCtor, out var addXamlCompilationAttribute, out var hideFromIntellisense, out var XamlResourceIdOnly, out var baseType, out var namedFields, out var parseException)) { if (parseException != null) context.ReportDiagnostic(Diagnostic.Create(Descriptors.XamlParserError, null, parseException.Message)); @@ -154,7 +154,7 @@ static void GenerateXamlCodeBehind(ProjectItem projItem, Compilation compilation if (hideFromIntellisense) sb.AppendLine($"\t[global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]"); - sb.AppendLine($"\tpublic partial class {rootType} : {baseType}"); + sb.AppendLine($"\t{accessModifier} partial class {rootType} : {baseType}"); sb.AppendLine("\t{"); //optional default ctor @@ -208,10 +208,11 @@ static void GenerateXamlCodeBehind(ProjectItem projItem, Compilation compilation context.AddSource(hintName, SourceText.From(sb.ToString(), Encoding.UTF8)); } - static bool TryParseXaml(SourceText text, string uid, Compilation compilation, IList xmlnsDefinitionCache, CancellationToken cancellationToken, out string? rootType, out string? rootClrNamespace, out bool generateDefaultCtor, out bool addXamlCompilationAttribute, out bool hideFromIntellisense, out bool xamlResourceIdOnly, out string? baseType, out IEnumerable<(string, string, string)>? namedFields, out Exception? exception) + static bool TryParseXaml(SourceText text, string uid, Compilation compilation, IList xmlnsDefinitionCache, CancellationToken cancellationToken, out string? accessModifier, out string? rootType, out string? rootClrNamespace, out bool generateDefaultCtor, out bool addXamlCompilationAttribute, out bool hideFromIntellisense, out bool xamlResourceIdOnly, out string? baseType, out IEnumerable<(string, string, string)>? namedFields, out Exception? exception) { cancellationToken.ThrowIfCancellationRequested(); + accessModifier = null; rootType = null; rootClrNamespace = null; generateDefaultCtor = false; @@ -283,6 +284,10 @@ static bool TryParseXaml(SourceText text, string uid, Compilation compilation, I var typeArguments = GetAttributeValue(root, "TypeArguments", XamlParser.X2006Uri, XamlParser.X2009Uri); baseType = GetTypeName(new XmlType(root.NamespaceURI, root.LocalName, typeArguments != null ? TypeArgumentsParser.ParseExpression(typeArguments, nsmgr, null) : null), compilation, xmlnsDefinitionCache); + // x:ClassModifier attribute + var classModifier = GetAttributeValue(root, "ClassModifier", XamlParser.X2006Uri, XamlParser.X2009Uri); + accessModifier = classModifier?.ToLowerInvariant().Replace("notpublic", "internal") ?? "public"; // notpublic is WPF for internal + return true; }