Skip to content

Commit 89cd0d9

Browse files
committed
Make NewLineOnAttributes the default
1 parent 7b2b7fa commit 89cd0d9

5 files changed

Lines changed: 227 additions & 63 deletions

File tree

src/Tests/TheTests.Page.verified.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
<MyPage Title="MyPage" xmlns="clr-namespace:Tests;assembly=Tests" xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
1+
<MyPage
2+
Title="MyPage"
3+
xmlns="clr-namespace:Tests;assembly=Tests"
4+
xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
25
<av:Grid>
36
<av:Button>Button</av:Button>
47
</av:Grid>

src/Tests/TheTests.UserControl.verified.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
<MyUserControl xmlns="clr-namespace:Tests;assembly=Tests" xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
1+
<MyUserControl
2+
xmlns="clr-namespace:Tests;assembly=Tests"
3+
xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
24
<av:Grid>
35
<av:Button>Button</av:Button>
46
</av:Grid>
Lines changed: 177 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
1-
<MyWindow Title="MyWindow" Width="525" Height="350" xmlns="clr-namespace:Tests;assembly=Tests" xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
2-
<av:DockPanel Name="MyPanel">
3-
<av:Menu Height="26" av:DockPanel.Dock="Top">
4-
<av:MenuItem Header="File">
5-
<av:MenuItem Header="Exit" />
1+
<MyWindow
2+
Title="MyWindow"
3+
Width="525"
4+
Height="350"
5+
xmlns="clr-namespace:Tests;assembly=Tests"
6+
xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
7+
<av:DockPanel
8+
Name="MyPanel">
9+
<av:Menu
10+
Height="26"
11+
av:DockPanel.Dock="Top">
12+
<av:MenuItem
13+
Header="File">
14+
<av:MenuItem
15+
Header="Exit" />
616
</av:MenuItem>
7-
<av:MenuItem Header="View">
8-
<av:MenuItem IsCheckable="True" IsChecked="True" Header="Standard" Name="StandardMenu" />
17+
<av:MenuItem
18+
Header="View">
19+
<av:MenuItem
20+
IsCheckable="True"
21+
IsChecked="True"
22+
Header="Standard"
23+
Name="StandardMenu" />
924
</av:MenuItem>
10-
<av:MenuItem Header="Help">
11-
<av:MenuItem Header="About" />
25+
<av:MenuItem
26+
Header="Help">
27+
<av:MenuItem
28+
Header="About" />
1229
</av:MenuItem>
1330
</av:Menu>
14-
<av:Grid ShowGridLines="False" Name="MyGrid">
31+
<av:Grid
32+
ShowGridLines="False"
33+
Name="MyGrid">
1534
<av:Grid.ColumnDefinitions>
1635
<av:ColumnDefinition />
1736
<av:ColumnDefinition />
@@ -31,35 +50,154 @@
3150
<av:RowDefinition />
3251
<av:RowDefinition />
3352
</av:Grid.RowDefinitions>
34-
<av:Button Name="B7" av:Grid.Column="4" av:Grid.Row="2">7</av:Button>
35-
<av:Button Name="B8" av:Grid.Column="5" av:Grid.Row="2">8</av:Button>
36-
<av:Button Name="B9" av:Grid.Column="6" av:Grid.Row="2">9</av:Button>
37-
<av:Button Name="B4" av:Grid.Column="4" av:Grid.Row="3">4</av:Button>
38-
<av:Button Name="B5" av:Grid.Column="5" av:Grid.Row="3">5</av:Button>
39-
<av:Button Name="B6" av:Grid.Column="6" av:Grid.Row="3">6</av:Button>
40-
<av:Button Name="B1" av:Grid.Column="4" av:Grid.Row="4">1</av:Button>
41-
<av:Button Name="B2" av:Grid.Column="5" av:Grid.Row="4">2</av:Button>
42-
<av:Button Name="B3" av:Grid.Column="6" av:Grid.Row="4">3</av:Button>
43-
<av:Button Name="B0" av:Grid.Column="4" av:Grid.Row="5">0</av:Button>
44-
<av:Button Name="BPeriod" av:Grid.Column="5" av:Grid.Row="5">.</av:Button>
45-
<av:Button Background="#FFA9A9A9" Name="BPM" av:Grid.Column="6" av:Grid.Row="5">+/-</av:Button>
46-
<av:Button Background="#FFA9A9A9" Name="BDevide" av:Grid.Column="7" av:Grid.Row="2">/</av:Button>
47-
<av:Button Background="#FFA9A9A9" Name="BMultiply" av:Grid.Column="7" av:Grid.Row="3">*</av:Button>
48-
<av:Button Background="#FFA9A9A9" Name="BMinus" av:Grid.Column="7" av:Grid.Row="4">-</av:Button>
49-
<av:Button Background="#FFA9A9A9" Name="BPlus" av:Grid.Column="7" av:Grid.Row="5">+</av:Button>
50-
<av:Button Background="#FFA9A9A9" Name="BSqrt" ToolTip="Usage: 'A Sqrt'" av:Grid.Column="8" av:Grid.Row="2">Sqrt</av:Button>
51-
<av:Button Background="#FFA9A9A9" Name="BPercent" ToolTip="Usage: 'A % B ='" av:Grid.Column="8" av:Grid.Row="3">%</av:Button>
52-
<av:Button Background="#FFA9A9A9" Name="BOneOver" ToolTip="Usage: 'A 1/X'" av:Grid.Column="8" av:Grid.Row="4">1/X</av:Button>
53-
<av:Button Background="#FFA9A9A9" Name="BEqual" av:Grid.Column="8" av:Grid.Row="5">=</av:Button>
54-
<av:Button Background="#FFA9A9A9" Name="BC" ToolTip="Clear All" av:Grid.Column="8" av:Grid.Row="1">C</av:Button>
55-
<av:Button Background="#FFA9A9A9" Name="BCE" ToolTip="Clear Current Entry" av:Grid.Column="7" av:Grid.Row="1">CE</av:Button>
56-
<av:Button Background="#FFA9A9A9" Name="BMemClear" ToolTip="Clear Memory" av:Grid.Column="3" av:Grid.Row="2">MC</av:Button>
57-
<av:Button Background="#FFA9A9A9" Name="BMemRecall" ToolTip="Recall Memory" av:Grid.Column="3" av:Grid.Row="3">MR</av:Button>
58-
<av:Button Background="#FFA9A9A9" Name="BMemSave" ToolTip="Store in Memory" av:Grid.Column="3" av:Grid.Row="4">MS</av:Button>
59-
<av:Button Background="#FFA9A9A9" Name="BMemPlus" ToolTip="Add To Memory" av:Grid.Column="3" av:Grid.Row="5">M+</av:Button>
60-
<av:TextBlock Text="Memory: [empty]" Name="BMemBox" Margin="10,17,10,17" av:Grid.Column="3" av:Grid.Row="1" av:Grid.ColumnSpan="2" />
61-
<av:TextBox Name="DisplayBox" Height="30" Margin="5,5,5,5" av:Grid.ColumnSpan="9" xml:space="preserve" />
62-
<av:TextBox Name="PaperBox" Margin="5,5,5,5" av:Grid.Row="1" av:Grid.ColumnSpan="3" av:Grid.RowSpan="5" xml:space="preserve" />
53+
<av:Button
54+
Name="B7"
55+
av:Grid.Column="4"
56+
av:Grid.Row="2">7</av:Button>
57+
<av:Button
58+
Name="B8"
59+
av:Grid.Column="5"
60+
av:Grid.Row="2">8</av:Button>
61+
<av:Button
62+
Name="B9"
63+
av:Grid.Column="6"
64+
av:Grid.Row="2">9</av:Button>
65+
<av:Button
66+
Name="B4"
67+
av:Grid.Column="4"
68+
av:Grid.Row="3">4</av:Button>
69+
<av:Button
70+
Name="B5"
71+
av:Grid.Column="5"
72+
av:Grid.Row="3">5</av:Button>
73+
<av:Button
74+
Name="B6"
75+
av:Grid.Column="6"
76+
av:Grid.Row="3">6</av:Button>
77+
<av:Button
78+
Name="B1"
79+
av:Grid.Column="4"
80+
av:Grid.Row="4">1</av:Button>
81+
<av:Button
82+
Name="B2"
83+
av:Grid.Column="5"
84+
av:Grid.Row="4">2</av:Button>
85+
<av:Button
86+
Name="B3"
87+
av:Grid.Column="6"
88+
av:Grid.Row="4">3</av:Button>
89+
<av:Button
90+
Name="B0"
91+
av:Grid.Column="4"
92+
av:Grid.Row="5">0</av:Button>
93+
<av:Button
94+
Name="BPeriod"
95+
av:Grid.Column="5"
96+
av:Grid.Row="5">.</av:Button>
97+
<av:Button
98+
Background="#FFA9A9A9"
99+
Name="BPM"
100+
av:Grid.Column="6"
101+
av:Grid.Row="5">+/-</av:Button>
102+
<av:Button
103+
Background="#FFA9A9A9"
104+
Name="BDevide"
105+
av:Grid.Column="7"
106+
av:Grid.Row="2">/</av:Button>
107+
<av:Button
108+
Background="#FFA9A9A9"
109+
Name="BMultiply"
110+
av:Grid.Column="7"
111+
av:Grid.Row="3">*</av:Button>
112+
<av:Button
113+
Background="#FFA9A9A9"
114+
Name="BMinus"
115+
av:Grid.Column="7"
116+
av:Grid.Row="4">-</av:Button>
117+
<av:Button
118+
Background="#FFA9A9A9"
119+
Name="BPlus"
120+
av:Grid.Column="7"
121+
av:Grid.Row="5">+</av:Button>
122+
<av:Button
123+
Background="#FFA9A9A9"
124+
Name="BSqrt"
125+
ToolTip="Usage: 'A Sqrt'"
126+
av:Grid.Column="8"
127+
av:Grid.Row="2">Sqrt</av:Button>
128+
<av:Button
129+
Background="#FFA9A9A9"
130+
Name="BPercent"
131+
ToolTip="Usage: 'A % B ='"
132+
av:Grid.Column="8"
133+
av:Grid.Row="3">%</av:Button>
134+
<av:Button
135+
Background="#FFA9A9A9"
136+
Name="BOneOver"
137+
ToolTip="Usage: 'A 1/X'"
138+
av:Grid.Column="8"
139+
av:Grid.Row="4">1/X</av:Button>
140+
<av:Button
141+
Background="#FFA9A9A9"
142+
Name="BEqual"
143+
av:Grid.Column="8"
144+
av:Grid.Row="5">=</av:Button>
145+
<av:Button
146+
Background="#FFA9A9A9"
147+
Name="BC"
148+
ToolTip="Clear All"
149+
av:Grid.Column="8"
150+
av:Grid.Row="1">C</av:Button>
151+
<av:Button
152+
Background="#FFA9A9A9"
153+
Name="BCE"
154+
ToolTip="Clear Current Entry"
155+
av:Grid.Column="7"
156+
av:Grid.Row="1">CE</av:Button>
157+
<av:Button
158+
Background="#FFA9A9A9"
159+
Name="BMemClear"
160+
ToolTip="Clear Memory"
161+
av:Grid.Column="3"
162+
av:Grid.Row="2">MC</av:Button>
163+
<av:Button
164+
Background="#FFA9A9A9"
165+
Name="BMemRecall"
166+
ToolTip="Recall Memory"
167+
av:Grid.Column="3"
168+
av:Grid.Row="3">MR</av:Button>
169+
<av:Button
170+
Background="#FFA9A9A9"
171+
Name="BMemSave"
172+
ToolTip="Store in Memory"
173+
av:Grid.Column="3"
174+
av:Grid.Row="4">MS</av:Button>
175+
<av:Button
176+
Background="#FFA9A9A9"
177+
Name="BMemPlus"
178+
ToolTip="Add To Memory"
179+
av:Grid.Column="3"
180+
av:Grid.Row="5">M+</av:Button>
181+
<av:TextBlock
182+
Text="Memory: [empty]"
183+
Name="BMemBox"
184+
Margin="10,17,10,17"
185+
av:Grid.Column="3"
186+
av:Grid.Row="1"
187+
av:Grid.ColumnSpan="2" />
188+
<av:TextBox
189+
Name="DisplayBox"
190+
Height="30"
191+
Margin="5,5,5,5"
192+
av:Grid.ColumnSpan="9"
193+
xml:space="preserve"></av:TextBox>
194+
<av:TextBox
195+
Name="PaperBox"
196+
Margin="5,5,5,5"
197+
av:Grid.Row="1"
198+
av:Grid.ColumnSpan="3"
199+
av:Grid.RowSpan="5"
200+
xml:space="preserve"></av:TextBox>
63201
</av:Grid>
64202
</av:DockPanel>
65203
</MyWindow>

src/Verify.Xaml/VerifyXaml.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System.Windows;
22

3+
using VerifyTests.Xaml;
4+
35
namespace VerifyTests;
46

57
public static class VerifyXaml

src/Verify.Xaml/WpfUtils.cs

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,41 @@
1-
using System.Windows;
1+
using System.Windows;
22
using System.Windows.Markup;
33
using System.Windows.Media;
44
using System.Windows.Media.Imaging;
55
using System.Xml;
66
using System.Xml.Linq;
7-
using VerifyTests.Xaml;
7+
8+
namespace VerifyTests.Xaml;
89

910
static class WpfUtils
1011
{
12+
private static readonly XmlWriterSettings writerSettings =
13+
new()
14+
{
15+
Indent = true,
16+
OmitXmlDeclaration = true,
17+
NewLineChars = "\n",
18+
IndentChars = " ",
19+
NewLineOnAttributes = true,
20+
};
21+
1122
public static string ToXamlString(this FrameworkElement element)
1223
{
13-
var builder = new StringBuilder();
14-
using var stringWriter = new StringWriter(builder);
15-
using var xmlWriter = new XmlTextWriter(stringWriter)
24+
var document = new XDocument();
25+
using (var writerToDoc = document.CreateWriter())
1626
{
17-
Formatting = Formatting.Indented
18-
};
19-
XamlWriter.Save(element, xmlWriter);
20-
var document = XDocument.Load(new StringReader(builder.ToString()));
21-
var root = document.Root!;
22-
foreach (var attribute in root.Attributes().ToList())
27+
XamlWriter.Save(element, writerToDoc);
28+
}
29+
30+
Purge(document);
31+
32+
var builder = new StringBuilder();
33+
using (var writerToString = XmlWriter.Create(builder, writerSettings))
2334
{
24-
var name = attribute.Name.ToString();
25-
if (name is
26-
"AllowsTransparency" or
27-
"ShowInTaskbar" or
28-
"WindowStyle" or
29-
"Opacity" or
30-
"Visibility")
31-
{
32-
attribute.Remove();
33-
}
35+
document.WriteTo(writerToString);
3436
}
3537

36-
return document.ToString();
38+
return builder.ToString();
3739
}
3840

3941
public static Stream ScreenCapture(FrameworkElement element)
@@ -79,4 +81,21 @@ public static Stream ScreenCapture(Window window)
7981
window.Close();
8082
}
8183
}
84+
static void Purge(XDocument document)
85+
{
86+
var root = document.Root!;
87+
foreach (var attribute in root.Attributes().ToList())
88+
{
89+
var name = attribute.Name.ToString();
90+
if (name is
91+
"AllowsTransparency" or
92+
"ShowInTaskbar" or
93+
"WindowStyle" or
94+
"Opacity" or
95+
"Visibility")
96+
{
97+
attribute.Remove();
98+
}
99+
}
100+
}
82101
}

0 commit comments

Comments
 (0)