Xaml Fxcop Rules Using Xaml Toolkit

Xaml Toolkit ... ding ding ding... if you heard and tried it..woohoo!!. If not, please go and give it a spin : Xaml Toolkit 

One of the nice things that you can do with it is write XAML FXCop rules. Now there has been a common ask of getting FXCop running on Xaml. Currently VS doesnt support this; but now you have the functionality at your tooltips. The toolkit has a Microsoft.Xaml.Tools.FxCop.dll which provides the base structure for your rules. So you could easily extend the inbuilt set of rules with that of your own.

So I tried a very simple rule to check if there are multiple access modifiers ie the presence of more than one _ in the content ...

<Button>_Hel_lo</Button> While this may be what the user wants, generally thats not the case. :) ... Note that this is just a simplistic scenario to show the usage. However, it could easily be extended to determine if there are duplicate access modifiers and this would be equivalent to the Globalization FxCop rule: AvoidDuplicateAccelerators.

namespace TestRule


    public class AvoidMultipleAccelerators : BaseXamlRule


        public AvoidMultipleAccelerators(): base("AvoidMultipleAccelerators", "TestRule.Rules", typeof(AvoidMultipleAccelerators).Assembly){}


        public override void CheckXaml(XamlDomObject rootObjectNode, XamlSchemaContext schemaContext, string resourceName)


            foreach (XamlDomObject obj2 in rootObjectNode.DescendantsAndSelf())


                XamlDomMember nameMember = obj2.GetMemberNode("Content");

                if (nameMember != null)


                    XamlDomValue nameValue = nameMember.Item as XamlDomValue;

                    if (nameValue != null)


                        if (nameValue.Value.ToString().Split('_').Length >2)


                           base.Problems.Add(base.CreateProblem(base.GetResolution(new object[] { nameValue.Value.ToString(), nameValue.StartLineNumber, nameValue.StartLinePosition }), nameMember.Member.Name, nameMember, resourceName));










 The object array created in the last highlighted line is used for the message. The rules are exposed through a Rules.xml file which has the syntax like

<Rules FriendlyName="TestRule">

  <Rule TypeName="AvoidMultipleAccelerators" Category="Microsoft.Xaml" CheckId="MSX1004">

    <Name>Avoid Multiple Access modifiers.</Name>

    <Description>Avoid Multiple Access modifier ( _ char).</Description>


    <Resolution>Consider changing the value '{0}' in XAML. Line# {1} Position# {2} </Resolution>

    <MessageLevel Certainty="95">CriticalError</MessageLevel>







 And now that your are done with the rule, on running, it will look like





 The code for this rule is attached . Note that you would need to download the Toolkit for the binaries in order to compile the project

Share this post