XAML格式化工具:XAML Styler

xaml,格式化,工具,styler · 浏览次数 : 294

小编点评

XAML格式化可以帮助开发人员提高代码的阅读性和可维护性,以下是一些生成XAML格式化的意义: * **缩进属性和元素:**可以使代码更加简洁,减少冗余空格和换行符。 * **保持代码结构清晰:**可以使代码更容易理解,方便维护。 * **确保项目风格一致:**可以使整个项目保持一致,提高开发效率。 * **方便团队协作:**可以使开发人员更容易理解和维护其他人的代码。 XAML格式化工具可以帮助开发人员自动格式化XAML代码,使其更加简洁和易于阅读。一些常用的工具包括: * **Visual Studio Marketplace中的 XAML Styler:**这是一个免费的工具,可以帮助开发人员轻松配置XAML格式化设置。 * **XAML Formatter:**这是一个免费的工具,可以帮助开发人员在Visual Studio中格式化XAML代码。 * **XAML Styler:**这是一个付费工具,可以帮助开发人员在Visual Studio中格式化XAML代码,并提供一些额外的设置选项。

正文

XAML格式化的意义

在开发WPF应用过程中,编写XAML时需要手动去缩进或者换行,随着时间的推移或者参与开发的人增多,XAML文件内容的格式会越来越乱。要么属性全都写在一行,内容太宽一屏无法完整展现;要么属性单独占一行,难以直观的看清结构;另外xaml元素的属性无序,重要属性查找困难,手动维护属性使之规律有序也比较费时。

格式化XAML代码可以使代码布局整齐,减少冗余空格和换行符,使代码结构清晰、缩进一致。使代码更易于阅读和理解,开发人员能够更快速地编写和修改代码。此外,还可以确保整个项目中的代码风格一致,对于团队协作和代码维护非常重要。然而微软官方并未提供很好的XAML格式化方案,不过Visual Studio Marketplace中有个非常好用的插件XAML Styler

安装配置XAML Styler

在Visual Studio的扩展管理窗口中,搜索XAML Styler下载安装后重启Visual Studio即可完成安装。在"工具"->"选项"中找到"XAML Styler"可以进行详细配置。每一项具体含义参见配置项说明
image
如果需要在XAML编辑器执行保存时自动格式化,需要把Format XAML on save设置为true。如果想手动格式化,则直接在XAML编辑器中右键菜单点击Format XAML或者使用快捷键进行格式化。
image

统一格式化标准

在团队开发中,即便所有的人都使用XAML Styler,也可能因个人习惯不同选择不同的设置,也会带来很多麻烦。针对这个问题,XAML Styler也提供了解决方案。

在项目的根目录创建一个名为"Settings.XamlStyler"的文件(不必引入到项目中),内容可参考Default Configuration,XAML Styler会根据这个文件而不是Visual Studio中的全局配置进行格式化,既解决了项目的统一格式化标准问题,也允许开发人员按照自己的习惯开发非团队项目。

"Settings.XamlStyler"配置项及注释如下,大家可根据自身习惯酌情修改

{
    "IndentSize": 4,  //缩进空格数,4【默认】
    "IndentWithTabs": false   //是否使用制表符进行缩进,false【默认】
    "AttributesTolerance": 2, //单行最大属性数,2【默认】,如果元素属性数不大于此数就不会换行
    "KeepFirstAttributeOnSameLine": false, //第一个属性是否与开始标记在同一行,false【默认】
    "MaxAttributeCharactersPerLine": 0, //多个属性大于多少个字符就该换行,0【默认】
    "MaxAttributesPerLine": 1, //大于几个属性就该换行,1【默认】
    "NewlineExemptionElements": "RadialGradientBrush, GradientStop, LinearGradientBrush, ScaleTransform, SkewTransform, RotateTransform, TranslateTransform, Trigger, Condition, Setter", //属性不应该跨行中断的元素
    "SeparateByGroups": false, //是否应该按照属性的分组进行分行,false【默认】
    "AttributeIndentation": 0,  //属性缩进空格字符数(-1不缩进;0【默认】缩进4个空格;其它个数则指定)
    "AttributeIndentationStyle": 1, //属性缩进风格(0混合,视情况使用制表符和空格;1【默认】使用空格)
    "RemoveDesignTimeReferences":  false, //是否移除自动添加的控件和设计时引用内容,false【默认】
    "IgnoreDesignTimeReferencePrefix": false, //排序时是否忽略带有设计时引用命名空间前缀的属性,false【默认】
    "EnableAttributeReordering": true, //是否启用属性的自动排序,true【默认】
    /*属性排序和分组规则*/
    "AttributeOrderingRuleGroups": [
        "x:Class",
        "xmlns, xmlns:x",
        "xmlns:*",
        "x:Key, Key, x:Name, Name, x:Uid, Uid, Title",
        "Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan, Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom",
        "Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight",
        "Margin, Padding, HorizontalAlignment, VerticalAlignment, HorizontalContentAlignment, VerticalContentAlignment, Panel.ZIndex",
        "*:*, *",
        "PageSource, PageIndex, Offset, Color, TargetName, Property, Value, StartPoint, EndPoint",
        "mc:Ignorable, d:IsDataSource, d:LayoutOverrides, d:IsStaticText",
        "Storyboard.*, From, To, Duration",
        "TargetType",
        "BasedOn"
    ],
    "FirstLineAttributes": "x:Name,Grid.Row,Grid.Column",  //应该在第一行的属性,例如x:Name 和x:Uid等等,None【默认】
    "OrderAttributesByName": true, //是否按照属性名称进行排序
    "PutEndingBracketOnNewLine": false, //结束括号是否独占一行,false【默认】
    "RemoveEndingTagOfEmptyElement": true, //是否移除空元素的结束标签,true【默认】
    "SpaceBeforeClosingSlash": true, //自闭合元素的末尾斜杠前是否要有空格,true【默认】
    "RootElementLineBreakRule": 0, //是否将根元素的属性分成多行(0【默认】;1始终;2从不)
    "ReorderVSM": 2, //是否重新排序visualstateManager(0未定义;1移到最前;2【默认】移到最后)
    "ReorderGridChildren": false, //是否重新排序Grid的子元素,false【默认】
    "ReorderCanvasChildren": false, //是否重新排序Canvas的子元素,false【默认】
    "ReorderSetters": 0, //是否重新排序Setter(0【默认】不排序;1按属性名;2按目标名;3先按目标名再按属性名)
    "FormatMarkupExtension": true, //是否格式化标记扩展的属性,true【默认】
    "NoNewLineMarkupExtensions": "x:Bind, Binding",     //始终放在一行上的标记扩展,"x:Bind, Binding"【默认】
    "ThicknessSeparator": 2, //Thickness类型的属性应该用哪种分隔符(0不格式化;1空格;2【默认】逗号)
    "ThicknessAttributes": "Margin, Padding, BorderThickness, ThumbnailClipMargin",     //被认定为Thickness的元素应该是哪些,"Margin, Padding, BorderThickness, ThumbnailClipMargin"【默认】
    "FormatOnSave": true, //是否在保存时进行格式化,true【默认】
    "CommentPadding": 2, //注释的间距应该是几个空格,2【默认】
}

部分属性配置选项

  • AttributeIndentationStyle
    • Mixed = 0 混合,视情况使用制表符和空格
    • Spaces = 1 【默认】使用空格
  • RootElementLineBreakRule
    • Default = 0 【默认】
    • Always = 1 始终
    • Never = 2 从不
  • ReorderVSM
    • None = 0 未定义
    • First = 1 移到最前
    • Last = 2 【默认】移到最后
  • ReorderSetters
    • None = 0 【默认】不排序
    • Property = 1 按属性名
    • TargetName = 2 按属性名
    • TargetNameThenProperty = 3 先按目标名再按属性名
  • ThicknessSeparator
    • None = 0 不格式化
    • Space = 1 空格
    • Comma = 2 【默认】逗号

如果对于上述配置中每一项的注释没有直观的感受,可以通过wiki查看每项配置对应代码格式化后的效果。

与XAML格式化工具:XAML Styler相似的内容:

XAML格式化工具:XAML Styler

### XAML格式化的意义 在开发WPF应用过程中,编写XAML时需要手动去缩进或者换行,随着时间的推移或者参与开发的人增多,XAML文件内容的格式会越来越乱。要么属性全都写在一行,内容太宽一屏无法完整展现;要么属性单独占一行,难以直观的看清结构;另外xaml元素的属性无序,重要属性查找困难,手动

【译】基于XAML的跨平台框架对比分析

多年来,基于XAML的UI框架已经有了很大的发展。下面的图表是最好的说明。这些框架主要包含:支持跨平台应用的Avalonia UI, Uno Platform和 .NET MAUI。事实上,除了Avalonia UI之外,对跨平台XAML的需求是其发展的主要驱动力。如果微软早点推出一个类似Flutt

【.NET深呼吸】将XAML放到WPF程序之外

上一篇水文中,老周说了一下纯代码编写 WPF 的大概过程。不过,还是不够的,本篇水文中咱们还要更进一步。 XAML 文件默认是作为资源打包进程序中的,而纯代码编写又导致一些常改动的东西变成硬编码了。为了取得二者平衡,咱们还要把一些经常修改的东西放到 XAML 文件中,不过 XAML 文件不编译进程序

【译】使 Visual Studio 更加可视化

任何 Web、桌面或移动开发人员都经常使用图像。你可以从 C#、HTML、XAML、CSS、C++、VB、TypeScript 甚至代码注释中引用它们。有些图像是本地的,有些存在于线上或网络共享中,而其他图像可能仅以 base64 编码字符串的形式存在。我们在代码中以多种方式引用它们,但总是作为字符

Simple WPF: WPF自定义一个可以定义步长的SpinBox

通过WPF的按钮、文本输入框实现了一个简单的SpinBox数字输入用户组件并可以通过数据绑定数值和步长。本文中介绍了通过Xaml代码实现自定义组件的布局,依赖属性的定义和使用等知识点。

Simple WPF: WPF 自定义按钮外形

WPF的按钮提供了Template模板,可以通过修改Template模板中的内容对按钮的样式进行自定义。结合资源字典,可以将自定义资源在xaml窗口、自定义控件或者整个App当中调用

WPF/C#:如何实现拖拉元素

前言 在Canvas中放置了一些元素,需要能够拖拉这些元素,在WPF Samples中的DragDropObjects项目中告诉了我们如何实现这种效果。 效果如下所示: 拖拉过程中的效果如下所示: 具体实现 xaml页面 我们先来看看xaml:

WPF/C#:数据绑定到方法

在WPF Samples中有一个关于数据绑定到方法的Demo,该Demo结构如下: 运行效果如下所示: 来看看是如何实现的。 先来看下MainWindow.xaml中的内容:

WPF/C#:如何将数据分组显示

WPF Samples中的示例 在WPF Samples中有一个关于Grouping的Demo。 该Demo结构如下: MainWindow.xaml如下:

WPF中非递归(无后台代码)动态实现TreeView

WPF中提供了TreeView控件,对于TreeView控件的基本使用已经有很多文章。大都是介绍如何在后台代码递归遍历数据源,动态创建TreeView。这里我想介绍一下如何只通过XAML标记,不用一行后台代码遍历数据实现TreeView。