GridTests.cs 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Xunit;
  5. using Xunit.Abstractions;
  6. namespace Avalonia.Controls.UnitTests
  7. {
  8. public class GridTests
  9. {
  10. private readonly ITestOutputHelper output;
  11. public GridTests(ITestOutputHelper output)
  12. {
  13. this.output = output;
  14. }
  15. private Grid CreateGrid(params (string name, GridLength width)[] columns)
  16. {
  17. return CreateGrid(columns.Select(c =>
  18. (c.name, c.width, ColumnDefinition.MinWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray());
  19. }
  20. private Grid CreateGrid(params (string name, GridLength width, double minWidth)[] columns)
  21. {
  22. return CreateGrid(columns.Select(c =>
  23. (c.name, c.width, c.minWidth, ColumnDefinition.MaxWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray());
  24. }
  25. private Grid CreateGrid(params (string name, GridLength width, double minWidth, double maxWidth)[] columns)
  26. {
  27. var grid = new Grid();
  28. foreach (var k in columns.Select(c => new ColumnDefinition
  29. {
  30. SharedSizeGroup = c.name,
  31. Width = c.width,
  32. MinWidth = c.minWidth,
  33. MaxWidth = c.maxWidth
  34. }))
  35. grid.ColumnDefinitions.Add(k);
  36. return grid;
  37. }
  38. private Control AddSizer(Grid grid, int column, double size = 30)
  39. {
  40. var ctrl = new Control { MinWidth = size, MinHeight = size };
  41. ctrl.SetValue(Grid.ColumnProperty, column);
  42. grid.Children.Add(ctrl);
  43. output.WriteLine($"[AddSizer] Column: {column} MinWidth: {size} MinHeight: {size}");
  44. return ctrl;
  45. }
  46. private void PrintColumnDefinitions(Grid grid)
  47. {
  48. output.WriteLine($"[Grid] ActualWidth: {grid.Bounds.Width} ActualHeight: {grid.Bounds.Width}");
  49. output.WriteLine($"[ColumnDefinitions]");
  50. for (int i = 0; i < grid.ColumnDefinitions.Count; i++)
  51. {
  52. var cd = grid.ColumnDefinitions[i];
  53. output.WriteLine($"[{i}] ActualWidth: {cd.ActualWidth} SharedSizeGroup: {cd.SharedSizeGroup}");
  54. }
  55. }
  56. [Fact]
  57. public void Calculates_Colspan_Correctly()
  58. {
  59. var target = new Grid
  60. {
  61. ColumnDefinitions = new ColumnDefinitions
  62. {
  63. new ColumnDefinition(GridLength.Auto),
  64. new ColumnDefinition(new GridLength(4, GridUnitType.Pixel)),
  65. new ColumnDefinition(GridLength.Auto),
  66. },
  67. RowDefinitions = new RowDefinitions
  68. {
  69. new RowDefinition(GridLength.Auto),
  70. new RowDefinition(GridLength.Auto),
  71. },
  72. Children =
  73. {
  74. new Border
  75. {
  76. Width = 100,
  77. Height = 25,
  78. [Grid.ColumnSpanProperty] = 3,
  79. },
  80. new Border
  81. {
  82. Width = 150,
  83. Height = 25,
  84. [Grid.RowProperty] = 1,
  85. },
  86. new Border
  87. {
  88. Width = 50,
  89. Height = 25,
  90. [Grid.RowProperty] = 1,
  91. [Grid.ColumnProperty] = 2,
  92. }
  93. },
  94. };
  95. target.Measure(Size.Infinity);
  96. // Issue #25 only appears after a second measure
  97. target.InvalidateMeasure();
  98. target.Measure(Size.Infinity);
  99. target.Arrange(new Rect(target.DesiredSize));
  100. Assert.Equal(new Size(204, 50), target.Bounds.Size);
  101. Assert.Equal(150d, target.ColumnDefinitions[0].ActualWidth);
  102. Assert.Equal(4d, target.ColumnDefinitions[1].ActualWidth);
  103. Assert.Equal(50d, target.ColumnDefinitions[2].ActualWidth);
  104. Assert.Equal(new Rect(52, 0, 100, 25), target.Children[0].Bounds);
  105. Assert.Equal(new Rect(0, 25, 150, 25), target.Children[1].Bounds);
  106. Assert.Equal(new Rect(154, 25, 50, 25), target.Children[2].Bounds);
  107. }
  108. [Fact]
  109. public void Layout_EmptyColumnRow_LayoutLikeANormalPanel()
  110. {
  111. // Arrange & Action
  112. var grid = GridMock.New(arrange: new Size(600, 200));
  113. // Assert
  114. GridAssert.ChildrenWidth(grid, 600);
  115. GridAssert.ChildrenHeight(grid, 200);
  116. }
  117. [Fact]
  118. public void Layout_PixelRowColumn_BoundsCorrect()
  119. {
  120. // Arrange & Action
  121. var rowGrid = GridMock.New(new RowDefinitions("100,200,300"));
  122. var columnGrid = GridMock.New(new ColumnDefinitions("50,100,150"));
  123. // Assert
  124. GridAssert.ChildrenHeight(rowGrid, 100, 200, 300);
  125. GridAssert.ChildrenWidth(columnGrid, 50, 100, 150);
  126. }
  127. [Fact]
  128. public void Layout_StarRowColumn_BoundsCorrect()
  129. {
  130. // Arrange & Action
  131. var rowGrid = GridMock.New(new RowDefinitions("1*,2*,3*"), 600);
  132. var columnGrid = GridMock.New(new ColumnDefinitions("*,*,2*"), 600);
  133. // Assert
  134. GridAssert.ChildrenHeight(rowGrid, 100, 200, 300);
  135. GridAssert.ChildrenWidth(columnGrid, 150, 150, 300);
  136. }
  137. [Fact]
  138. public void Layout_MixPixelStarRowColumn_BoundsCorrect()
  139. {
  140. // Arrange & Action
  141. var rowGrid = GridMock.New(new RowDefinitions("1*,2*,150"), 600);
  142. var columnGrid = GridMock.New(new ColumnDefinitions("1*,2*,150"), 600);
  143. // Assert
  144. GridAssert.ChildrenHeight(rowGrid, 150, 300, 150);
  145. GridAssert.ChildrenWidth(columnGrid, 150, 300, 150);
  146. }
  147. [Fact]
  148. public void Layout_StarRowColumnWithMinLength_BoundsCorrect()
  149. {
  150. // Arrange & Action
  151. var rowGrid = GridMock.New(new RowDefinitions
  152. {
  153. new RowDefinition(1, GridUnitType.Star) { MinHeight = 200 },
  154. new RowDefinition(1, GridUnitType.Star),
  155. new RowDefinition(1, GridUnitType.Star),
  156. }, 300);
  157. var columnGrid = GridMock.New(new ColumnDefinitions
  158. {
  159. new ColumnDefinition(1, GridUnitType.Star) { MinWidth = 200 },
  160. new ColumnDefinition(1, GridUnitType.Star),
  161. new ColumnDefinition(1, GridUnitType.Star),
  162. }, 300);
  163. // Assert
  164. GridAssert.ChildrenHeight(rowGrid, 200, 50, 50);
  165. GridAssert.ChildrenWidth(columnGrid, 200, 50, 50);
  166. }
  167. [Fact]
  168. public void Layout_StarRowColumnWithMaxLength_BoundsCorrect()
  169. {
  170. // Arrange & Action
  171. var rowGrid = GridMock.New(new RowDefinitions
  172. {
  173. new RowDefinition(1, GridUnitType.Star) { MaxHeight = 200 },
  174. new RowDefinition(1, GridUnitType.Star),
  175. new RowDefinition(1, GridUnitType.Star),
  176. }, 800);
  177. var columnGrid = GridMock.New(new ColumnDefinitions
  178. {
  179. new ColumnDefinition(1, GridUnitType.Star) { MaxWidth = 200 },
  180. new ColumnDefinition(1, GridUnitType.Star),
  181. new ColumnDefinition(1, GridUnitType.Star),
  182. }, 800);
  183. // Assert
  184. GridAssert.ChildrenHeight(rowGrid, 200, 300, 300);
  185. GridAssert.ChildrenWidth(columnGrid, 200, 300, 300);
  186. }
  187. [Fact]
  188. public void Changing_Child_Column_Invalidates_Measure()
  189. {
  190. Border child;
  191. var target = new Grid
  192. {
  193. ColumnDefinitions = new ColumnDefinitions("*,*"),
  194. Children =
  195. {
  196. (child = new Border
  197. {
  198. [Grid.ColumnProperty] = 0,
  199. }),
  200. }
  201. };
  202. target.Measure(Size.Infinity);
  203. target.Arrange(new Rect(target.DesiredSize));
  204. Assert.True(target.IsMeasureValid);
  205. Grid.SetColumn(child, 1);
  206. Assert.False(target.IsMeasureValid);
  207. }
  208. [Fact]
  209. public void Grid_GridLength_Same_Size_Pixel_0()
  210. {
  211. var grid = CreateGrid(
  212. (null, new GridLength()),
  213. (null, new GridLength()),
  214. (null, new GridLength()),
  215. (null, new GridLength()));
  216. var scope = new Grid();
  217. scope.Children.Add(grid);
  218. var root = new Grid();
  219. root.UseLayoutRounding = false;
  220. root.SetValue(Grid.IsSharedSizeScopeProperty, false);
  221. root.Children.Add(scope);
  222. grid.Measure(new Size(200, 200));
  223. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  224. PrintColumnDefinitions(grid);
  225. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == null), cd => Assert.Equal(0, cd.ActualWidth));
  226. }
  227. [Fact]
  228. public void Grid_GridLength_Same_Size_Pixel_50()
  229. {
  230. var grid = CreateGrid(
  231. (null, new GridLength(50)),
  232. (null, new GridLength(50)),
  233. (null, new GridLength(50)),
  234. (null, new GridLength(50)));
  235. var scope = new Grid();
  236. scope.Children.Add(grid);
  237. var root = new Grid();
  238. root.UseLayoutRounding = false;
  239. root.SetValue(Grid.IsSharedSizeScopeProperty, false);
  240. root.Children.Add(scope);
  241. grid.Measure(new Size(200, 200));
  242. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  243. PrintColumnDefinitions(grid);
  244. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == null), cd => Assert.Equal(50, cd.ActualWidth));
  245. }
  246. [Fact]
  247. public void Grid_GridLength_Same_Size_Auto()
  248. {
  249. var grid = CreateGrid(
  250. (null, new GridLength(0, GridUnitType.Auto)),
  251. (null, new GridLength(0, GridUnitType.Auto)),
  252. (null, new GridLength(0, GridUnitType.Auto)),
  253. (null, new GridLength(0, GridUnitType.Auto)));
  254. var scope = new Grid();
  255. scope.Children.Add(grid);
  256. var root = new Grid();
  257. root.UseLayoutRounding = false;
  258. root.SetValue(Grid.IsSharedSizeScopeProperty, false);
  259. root.Children.Add(scope);
  260. grid.Measure(new Size(200, 200));
  261. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  262. PrintColumnDefinitions(grid);
  263. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == null), cd => Assert.Equal(0, cd.ActualWidth));
  264. }
  265. [Fact]
  266. public void Grid_GridLength_Same_Size_Star()
  267. {
  268. var grid = CreateGrid(
  269. (null, new GridLength(1, GridUnitType.Star)),
  270. (null, new GridLength(1, GridUnitType.Star)),
  271. (null, new GridLength(1, GridUnitType.Star)),
  272. (null, new GridLength(1, GridUnitType.Star)));
  273. var scope = new Grid();
  274. scope.Children.Add(grid);
  275. var root = new Grid();
  276. root.UseLayoutRounding = false;
  277. root.SetValue(Grid.IsSharedSizeScopeProperty, false);
  278. root.Children.Add(scope);
  279. grid.Measure(new Size(200, 200));
  280. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  281. PrintColumnDefinitions(grid);
  282. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == null), cd => Assert.Equal(50, cd.ActualWidth));
  283. }
  284. [Fact]
  285. public void SharedSize_Grid_GridLength_Same_Size_Pixel_0()
  286. {
  287. var grid = CreateGrid(
  288. ("A", new GridLength()),
  289. ("A", new GridLength()),
  290. ("A", new GridLength()),
  291. ("A", new GridLength()));
  292. var scope = new Grid();
  293. scope.Children.Add(grid);
  294. var root = new Grid();
  295. root.UseLayoutRounding = false;
  296. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  297. root.Children.Add(scope);
  298. grid.Measure(new Size(200, 200));
  299. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  300. PrintColumnDefinitions(grid);
  301. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  302. }
  303. [Fact]
  304. public void SharedSize_Grid_GridLength_Same_Size_Pixel_50()
  305. {
  306. var grid = CreateGrid(
  307. ("A", new GridLength(50)),
  308. ("A", new GridLength(50)),
  309. ("A", new GridLength(50)),
  310. ("A", new GridLength(50)));
  311. var scope = new Grid();
  312. scope.Children.Add(grid);
  313. var root = new Grid();
  314. root.UseLayoutRounding = false;
  315. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  316. root.Children.Add(scope);
  317. grid.Measure(new Size(200, 200));
  318. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  319. PrintColumnDefinitions(grid);
  320. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(50, cd.ActualWidth));
  321. }
  322. [Fact]
  323. public void SharedSize_Grid_GridLength_Same_Size_Auto()
  324. {
  325. var grid = CreateGrid(
  326. ("A", new GridLength(0, GridUnitType.Auto)),
  327. ("A", new GridLength(0, GridUnitType.Auto)),
  328. ("A", new GridLength(0, GridUnitType.Auto)),
  329. ("A", new GridLength(0, GridUnitType.Auto)));
  330. var scope = new Grid();
  331. scope.Children.Add(grid);
  332. var root = new Grid();
  333. root.UseLayoutRounding = false;
  334. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  335. root.Children.Add(scope);
  336. grid.Measure(new Size(200, 200));
  337. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  338. PrintColumnDefinitions(grid);
  339. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  340. }
  341. [Fact]
  342. public void SharedSize_Grid_GridLength_Same_Size_Star()
  343. {
  344. var grid = CreateGrid(
  345. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  346. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  347. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  348. ("A", new GridLength(1, GridUnitType.Star))); // Star sizing is treated as Auto, 1 is ignored
  349. var scope = new Grid();
  350. scope.Children.Add(grid);
  351. var root = new Grid();
  352. root.UseLayoutRounding = false;
  353. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  354. root.Children.Add(scope);
  355. grid.Measure(new Size(200, 200));
  356. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  357. PrintColumnDefinitions(grid);
  358. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  359. }
  360. [Fact]
  361. public void SharedSize_Grid_GridLength_Same_Size_Pixel_0_First_Column_0()
  362. {
  363. var grid = CreateGrid(
  364. (null, new GridLength()),
  365. ("A", new GridLength()),
  366. ("A", new GridLength()),
  367. ("A", new GridLength()),
  368. ("A", new GridLength()));
  369. var scope = new Grid();
  370. scope.Children.Add(grid);
  371. var root = new Grid();
  372. root.UseLayoutRounding = false;
  373. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  374. root.Children.Add(scope);
  375. grid.Measure(new Size(200, 200));
  376. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  377. PrintColumnDefinitions(grid);
  378. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  379. }
  380. [Fact]
  381. public void SharedSize_Grid_GridLength_Same_Size_Pixel_50_First_Column_0()
  382. {
  383. var grid = CreateGrid(
  384. (null, new GridLength()),
  385. ("A", new GridLength(50)),
  386. ("A", new GridLength(50)),
  387. ("A", new GridLength(50)),
  388. ("A", new GridLength(50)));
  389. var scope = new Grid();
  390. scope.Children.Add(grid);
  391. var root = new Grid();
  392. root.UseLayoutRounding = false;
  393. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  394. root.Children.Add(scope);
  395. grid.Measure(new Size(200, 200));
  396. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  397. PrintColumnDefinitions(grid);
  398. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(50, cd.ActualWidth));
  399. }
  400. [Fact]
  401. public void SharedSize_Grid_GridLength_Same_Size_Auto_First_Column_0()
  402. {
  403. var grid = CreateGrid(
  404. (null, new GridLength()),
  405. ("A", new GridLength(0, GridUnitType.Auto)),
  406. ("A", new GridLength(0, GridUnitType.Auto)),
  407. ("A", new GridLength(0, GridUnitType.Auto)),
  408. ("A", new GridLength(0, GridUnitType.Auto)));
  409. var scope = new Grid();
  410. scope.Children.Add(grid);
  411. var root = new Grid();
  412. root.UseLayoutRounding = false;
  413. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  414. root.Children.Add(scope);
  415. grid.Measure(new Size(200, 200));
  416. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  417. PrintColumnDefinitions(grid);
  418. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  419. }
  420. [Fact]
  421. public void SharedSize_Grid_GridLength_Same_Size_Star_First_Column_0()
  422. {
  423. var grid = CreateGrid(
  424. (null, new GridLength()),
  425. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  426. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  427. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  428. ("A", new GridLength(1, GridUnitType.Star))); // Star sizing is treated as Auto, 1 is ignored
  429. var scope = new Grid();
  430. scope.Children.Add(grid);
  431. var root = new Grid();
  432. root.UseLayoutRounding = false;
  433. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  434. root.Children.Add(scope);
  435. grid.Measure(new Size(200, 200));
  436. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  437. PrintColumnDefinitions(grid);
  438. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  439. }
  440. [Fact]
  441. public void SharedSize_Grid_GridLength_Same_Size_Pixel_0_Last_Column_0()
  442. {
  443. var grid = CreateGrid(
  444. ("A", new GridLength()),
  445. ("A", new GridLength()),
  446. ("A", new GridLength()),
  447. ("A", new GridLength()),
  448. (null, new GridLength()));
  449. var scope = new Grid();
  450. scope.Children.Add(grid);
  451. var root = new Grid();
  452. root.UseLayoutRounding = false;
  453. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  454. root.Children.Add(scope);
  455. grid.Measure(new Size(200, 200));
  456. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  457. PrintColumnDefinitions(grid);
  458. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  459. }
  460. [Fact]
  461. public void SharedSize_Grid_GridLength_Same_Size_Pixel_50_Last_Column_0()
  462. {
  463. var grid = CreateGrid(
  464. ("A", new GridLength(50)),
  465. ("A", new GridLength(50)),
  466. ("A", new GridLength(50)),
  467. ("A", new GridLength(50)),
  468. (null, new GridLength()));
  469. var scope = new Grid();
  470. scope.Children.Add(grid);
  471. var root = new Grid();
  472. root.UseLayoutRounding = false;
  473. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  474. root.Children.Add(scope);
  475. grid.Measure(new Size(200, 200));
  476. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  477. PrintColumnDefinitions(grid);
  478. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(50, cd.ActualWidth));
  479. }
  480. [Fact]
  481. public void SharedSize_Grid_GridLength_Same_Size_Auto_Last_Column_0()
  482. {
  483. var grid = CreateGrid(
  484. ("A", new GridLength(0, GridUnitType.Auto)),
  485. ("A", new GridLength(0, GridUnitType.Auto)),
  486. ("A", new GridLength(0, GridUnitType.Auto)),
  487. ("A", new GridLength(0, GridUnitType.Auto)),
  488. (null, new GridLength()));
  489. var scope = new Grid();
  490. scope.Children.Add(grid);
  491. var root = new Grid();
  492. root.UseLayoutRounding = false;
  493. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  494. root.Children.Add(scope);
  495. grid.Measure(new Size(200, 200));
  496. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  497. PrintColumnDefinitions(grid);
  498. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  499. }
  500. [Fact]
  501. public void SharedSize_Grid_GridLength_Same_Size_Star_Last_Column_0()
  502. {
  503. var grid = CreateGrid(
  504. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  505. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  506. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  507. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  508. (null, new GridLength()));
  509. var scope = new Grid();
  510. scope.Children.Add(grid);
  511. var root = new Grid();
  512. root.UseLayoutRounding = false;
  513. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  514. root.Children.Add(scope);
  515. grid.Measure(new Size(200, 200));
  516. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  517. PrintColumnDefinitions(grid);
  518. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  519. }
  520. [Fact]
  521. public void SharedSize_Grid_GridLength_Same_Size_Pixel_0_First_And_Last_Column_0()
  522. {
  523. var grid = CreateGrid(
  524. (null, new GridLength()),
  525. ("A", new GridLength()),
  526. ("A", new GridLength()),
  527. ("A", new GridLength()),
  528. ("A", new GridLength()),
  529. (null, new GridLength()));
  530. var scope = new Grid();
  531. scope.Children.Add(grid);
  532. var root = new Grid();
  533. root.UseLayoutRounding = false;
  534. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  535. root.Children.Add(scope);
  536. grid.Measure(new Size(200, 200));
  537. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  538. PrintColumnDefinitions(grid);
  539. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  540. }
  541. [Fact]
  542. public void SharedSize_Grid_GridLength_Same_Size_Pixel_50_First_And_Last_Column_0()
  543. {
  544. var grid = CreateGrid(
  545. (null, new GridLength()),
  546. ("A", new GridLength(50)),
  547. ("A", new GridLength(50)),
  548. ("A", new GridLength(50)),
  549. ("A", new GridLength(50)),
  550. (null, new GridLength()));
  551. var scope = new Grid();
  552. scope.Children.Add(grid);
  553. var root = new Grid();
  554. root.UseLayoutRounding = false;
  555. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  556. root.Children.Add(scope);
  557. grid.Measure(new Size(200, 200));
  558. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  559. PrintColumnDefinitions(grid);
  560. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(50, cd.ActualWidth));
  561. }
  562. [Fact]
  563. public void SharedSize_Grid_GridLength_Same_Size_Auto_First_And_Last_Column_0()
  564. {
  565. var grid = CreateGrid(
  566. (null, new GridLength()),
  567. ("A", new GridLength(0, GridUnitType.Auto)),
  568. ("A", new GridLength(0, GridUnitType.Auto)),
  569. ("A", new GridLength(0, GridUnitType.Auto)),
  570. ("A", new GridLength(0, GridUnitType.Auto)),
  571. (null, new GridLength()));
  572. var scope = new Grid();
  573. scope.Children.Add(grid);
  574. var root = new Grid();
  575. root.UseLayoutRounding = false;
  576. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  577. root.Children.Add(scope);
  578. grid.Measure(new Size(200, 200));
  579. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  580. PrintColumnDefinitions(grid);
  581. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  582. }
  583. [Fact]
  584. public void SharedSize_Grid_GridLength_Same_Size_Star_First_And_Last_Column_0()
  585. {
  586. var grid = CreateGrid(
  587. (null, new GridLength()),
  588. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  589. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  590. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  591. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  592. (null, new GridLength()));
  593. var scope = new Grid();
  594. scope.Children.Add(grid);
  595. var root = new Grid();
  596. root.UseLayoutRounding = false;
  597. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  598. root.Children.Add(scope);
  599. grid.Measure(new Size(200, 200));
  600. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  601. PrintColumnDefinitions(grid);
  602. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  603. }
  604. [Fact]
  605. public void SharedSize_Grid_GridLength_Same_Size_Pixel_0_Two_Groups()
  606. {
  607. var grid = CreateGrid(
  608. ("A", new GridLength()),
  609. ("B", new GridLength()),
  610. ("B", new GridLength()),
  611. ("A", new GridLength()));
  612. var scope = new Grid();
  613. scope.Children.Add(grid);
  614. var root = new Grid();
  615. root.UseLayoutRounding = false;
  616. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  617. root.Children.Add(scope);
  618. grid.Measure(new Size(200, 200));
  619. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  620. PrintColumnDefinitions(grid);
  621. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  622. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  623. }
  624. [Fact]
  625. public void SharedSize_Grid_GridLength_Same_Size_Pixel_50_Two_Groups()
  626. {
  627. var grid = CreateGrid(
  628. ("A", new GridLength(25)),
  629. ("B", new GridLength(75)),
  630. ("B", new GridLength(75)),
  631. ("A", new GridLength(25)));
  632. var scope = new Grid();
  633. scope.Children.Add(grid);
  634. var root = new Grid();
  635. root.UseLayoutRounding = false;
  636. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  637. root.Children.Add(scope);
  638. grid.Measure(new Size(200, 200));
  639. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  640. PrintColumnDefinitions(grid);
  641. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(25, cd.ActualWidth));
  642. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(75, cd.ActualWidth));
  643. }
  644. [Fact]
  645. public void SharedSize_Grid_GridLength_Same_Size_Auto_Two_Groups()
  646. {
  647. var grid = CreateGrid(
  648. ("A", new GridLength(0, GridUnitType.Auto)),
  649. ("B", new GridLength(0, GridUnitType.Auto)),
  650. ("B", new GridLength(0, GridUnitType.Auto)),
  651. ("A", new GridLength(0, GridUnitType.Auto)));
  652. var scope = new Grid();
  653. scope.Children.Add(grid);
  654. var root = new Grid();
  655. root.UseLayoutRounding = false;
  656. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  657. root.Children.Add(scope);
  658. grid.Measure(new Size(200, 200));
  659. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  660. PrintColumnDefinitions(grid);
  661. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  662. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  663. }
  664. [Fact]
  665. public void SharedSize_Grid_GridLength_Same_Size_Star_Two_Groups()
  666. {
  667. var grid = CreateGrid(
  668. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  669. ("B", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  670. ("B", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  671. ("A", new GridLength(1, GridUnitType.Star))); // Star sizing is treated as Auto, 1 is ignored
  672. var scope = new Grid();
  673. scope.Children.Add(grid);
  674. var root = new Grid();
  675. root.UseLayoutRounding = false;
  676. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  677. root.Children.Add(scope);
  678. grid.Measure(new Size(200, 200));
  679. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  680. PrintColumnDefinitions(grid);
  681. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  682. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  683. }
  684. [Fact]
  685. public void SharedSize_Grid_GridLength_Same_Size_Pixel_0_First_Column_0_Two_Groups()
  686. {
  687. var grid = CreateGrid(
  688. (null, new GridLength()),
  689. ("A", new GridLength()),
  690. ("B", new GridLength()),
  691. ("B", new GridLength()),
  692. ("A", new GridLength()));
  693. var scope = new Grid();
  694. scope.Children.Add(grid);
  695. var root = new Grid();
  696. root.UseLayoutRounding = false;
  697. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  698. root.Children.Add(scope);
  699. grid.Measure(new Size(200, 200));
  700. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  701. PrintColumnDefinitions(grid);
  702. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  703. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  704. }
  705. [Fact]
  706. public void SharedSize_Grid_GridLength_Same_Size_Pixel_50_First_Column_0_Two_Groups()
  707. {
  708. var grid = CreateGrid(
  709. (null, new GridLength()),
  710. ("A", new GridLength(25)),
  711. ("B", new GridLength(75)),
  712. ("B", new GridLength(75)),
  713. ("A", new GridLength(25)));
  714. var scope = new Grid();
  715. scope.Children.Add(grid);
  716. var root = new Grid();
  717. root.UseLayoutRounding = false;
  718. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  719. root.Children.Add(scope);
  720. grid.Measure(new Size(200, 200));
  721. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  722. PrintColumnDefinitions(grid);
  723. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(25, cd.ActualWidth));
  724. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(75, cd.ActualWidth));
  725. }
  726. [Fact]
  727. public void SharedSize_Grid_GridLength_Same_Size_Auto_First_Column_0_Two_Groups()
  728. {
  729. var grid = CreateGrid(
  730. (null, new GridLength()),
  731. ("A", new GridLength(0, GridUnitType.Auto)),
  732. ("B", new GridLength(0, GridUnitType.Auto)),
  733. ("B", new GridLength(0, GridUnitType.Auto)),
  734. ("A", new GridLength(0, GridUnitType.Auto)));
  735. var scope = new Grid();
  736. scope.Children.Add(grid);
  737. var root = new Grid();
  738. root.UseLayoutRounding = false;
  739. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  740. root.Children.Add(scope);
  741. grid.Measure(new Size(200, 200));
  742. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  743. PrintColumnDefinitions(grid);
  744. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  745. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  746. }
  747. [Fact]
  748. public void SharedSize_Grid_GridLength_Same_Size_Star_First_Column_0_Two_Groups()
  749. {
  750. var grid = CreateGrid(
  751. (null, new GridLength()),
  752. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  753. ("B", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  754. ("B", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  755. ("A", new GridLength(1, GridUnitType.Star))); // Star sizing is treated as Auto, 1 is ignored
  756. var scope = new Grid();
  757. scope.Children.Add(grid);
  758. var root = new Grid();
  759. root.UseLayoutRounding = false;
  760. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  761. root.Children.Add(scope);
  762. grid.Measure(new Size(200, 200));
  763. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  764. PrintColumnDefinitions(grid);
  765. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  766. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  767. }
  768. [Fact]
  769. public void SharedSize_Grid_GridLength_Same_Size_Pixel_0_Last_Column_0_Two_Groups()
  770. {
  771. var grid = CreateGrid(
  772. ("A", new GridLength()),
  773. ("B", new GridLength()),
  774. ("B", new GridLength()),
  775. ("A", new GridLength()),
  776. (null, new GridLength()));
  777. var scope = new Grid();
  778. scope.Children.Add(grid);
  779. var root = new Grid();
  780. root.UseLayoutRounding = false;
  781. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  782. root.Children.Add(scope);
  783. grid.Measure(new Size(200, 200));
  784. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  785. PrintColumnDefinitions(grid);
  786. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  787. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  788. }
  789. [Fact]
  790. public void SharedSize_Grid_GridLength_Same_Size_Pixel_50_Last_Column_0_Two_Groups()
  791. {
  792. var grid = CreateGrid(
  793. ("A", new GridLength(25)),
  794. ("B", new GridLength(75)),
  795. ("B", new GridLength(75)),
  796. ("A", new GridLength(25)),
  797. (null, new GridLength()));
  798. var scope = new Grid();
  799. scope.Children.Add(grid);
  800. var root = new Grid();
  801. root.UseLayoutRounding = false;
  802. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  803. root.Children.Add(scope);
  804. grid.Measure(new Size(200, 200));
  805. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  806. PrintColumnDefinitions(grid);
  807. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(25, cd.ActualWidth));
  808. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(75, cd.ActualWidth));
  809. }
  810. [Fact]
  811. public void SharedSize_Grid_GridLength_Same_Size_Auto_Last_Column_0_Two_Groups()
  812. {
  813. var grid = CreateGrid(
  814. ("A", new GridLength(0, GridUnitType.Auto)),
  815. ("B", new GridLength(0, GridUnitType.Auto)),
  816. ("B", new GridLength(0, GridUnitType.Auto)),
  817. ("A", new GridLength(0, GridUnitType.Auto)),
  818. (null, new GridLength()));
  819. var scope = new Grid();
  820. scope.Children.Add(grid);
  821. var root = new Grid();
  822. root.UseLayoutRounding = false;
  823. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  824. root.Children.Add(scope);
  825. grid.Measure(new Size(200, 200));
  826. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  827. PrintColumnDefinitions(grid);
  828. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  829. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  830. }
  831. [Fact]
  832. public void SharedSize_Grid_GridLength_Same_Size_Star_Last_Column_0_Two_Groups()
  833. {
  834. var grid = CreateGrid(
  835. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  836. ("B", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  837. ("B", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  838. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  839. (null, new GridLength()));
  840. var scope = new Grid();
  841. scope.Children.Add(grid);
  842. var root = new Grid();
  843. root.UseLayoutRounding = false;
  844. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  845. root.Children.Add(scope);
  846. grid.Measure(new Size(200, 200));
  847. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  848. PrintColumnDefinitions(grid);
  849. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  850. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  851. }
  852. [Fact]
  853. public void SharedSize_Grid_GridLength_Same_Size_Pixel_0_First_And_Last_Column_0_Two_Groups()
  854. {
  855. var grid = CreateGrid(
  856. (null, new GridLength()),
  857. ("A", new GridLength()),
  858. ("B", new GridLength()),
  859. ("B", new GridLength()),
  860. ("A", new GridLength()),
  861. (null, new GridLength()));
  862. var scope = new Grid();
  863. scope.Children.Add(grid);
  864. var root = new Grid();
  865. root.UseLayoutRounding = false;
  866. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  867. root.Children.Add(scope);
  868. grid.Measure(new Size(200, 200));
  869. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  870. PrintColumnDefinitions(grid);
  871. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  872. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  873. }
  874. [Fact]
  875. public void SharedSize_Grid_GridLength_Same_Size_Pixel_50_First_And_Last_Column_0_Two_Groups()
  876. {
  877. var grid = CreateGrid(
  878. (null, new GridLength()),
  879. ("A", new GridLength(25)),
  880. ("B", new GridLength(75)),
  881. ("B", new GridLength(75)),
  882. ("A", new GridLength(25)),
  883. (null, new GridLength()));
  884. var scope = new Grid();
  885. scope.Children.Add(grid);
  886. var root = new Grid();
  887. root.UseLayoutRounding = false;
  888. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  889. root.Children.Add(scope);
  890. grid.Measure(new Size(200, 200));
  891. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  892. PrintColumnDefinitions(grid);
  893. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(25, cd.ActualWidth));
  894. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(75, cd.ActualWidth));
  895. }
  896. [Fact]
  897. public void SharedSize_Grid_GridLength_Same_Size_Auto_First_And_Last_Column_0_Two_Groups()
  898. {
  899. var grid = CreateGrid(
  900. (null, new GridLength()),
  901. ("A", new GridLength(0, GridUnitType.Auto)),
  902. ("B", new GridLength(0, GridUnitType.Auto)),
  903. ("B", new GridLength(0, GridUnitType.Auto)),
  904. ("A", new GridLength(0, GridUnitType.Auto)),
  905. (null, new GridLength()));
  906. var scope = new Grid();
  907. scope.Children.Add(grid);
  908. var root = new Grid();
  909. root.UseLayoutRounding = false;
  910. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  911. root.Children.Add(scope);
  912. grid.Measure(new Size(200, 200));
  913. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  914. PrintColumnDefinitions(grid);
  915. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  916. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  917. }
  918. [Fact]
  919. public void SharedSize_Grid_GridLength_Same_Size_Star_First_And_Last_Column_0_Two_Groups()
  920. {
  921. var grid = CreateGrid(
  922. (null, new GridLength()),
  923. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  924. ("B", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  925. ("B", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  926. ("A", new GridLength(1, GridUnitType.Star)), // Star sizing is treated as Auto, 1 is ignored
  927. (null, new GridLength()));
  928. var scope = new Grid();
  929. scope.Children.Add(grid);
  930. var root = new Grid();
  931. root.UseLayoutRounding = false;
  932. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  933. root.Children.Add(scope);
  934. grid.Measure(new Size(200, 200));
  935. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  936. PrintColumnDefinitions(grid);
  937. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  938. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(0, cd.ActualWidth));
  939. }
  940. [Fact]
  941. public void Size_Propagation_Is_Constrained_To_Innermost_Scope()
  942. {
  943. var grids = new[] { CreateGrid(("A", new GridLength())), CreateGrid(("A", new GridLength(30)), (null, new GridLength())) };
  944. var innerScope = new Grid();
  945. foreach (var grid in grids)
  946. innerScope.Children.Add(grid);
  947. innerScope.SetValue(Grid.IsSharedSizeScopeProperty, true);
  948. var outerGrid = CreateGrid(("A", new GridLength(0)));
  949. var outerScope = new Grid();
  950. outerScope.Children.Add(outerGrid);
  951. outerScope.Children.Add(innerScope);
  952. var root = new Grid();
  953. root.UseLayoutRounding = false;
  954. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  955. root.Children.Add(outerScope);
  956. root.Measure(new Size(50, 50));
  957. root.Arrange(new Rect(new Point(), new Point(50, 50)));
  958. Assert.Equal(0, outerGrid.ColumnDefinitions[0].ActualWidth);
  959. }
  960. [Fact]
  961. public void Size_Group_Changes_Are_Tracked()
  962. {
  963. var grids = new[] {
  964. CreateGrid((null, new GridLength(0, GridUnitType.Auto)), (null, new GridLength())),
  965. CreateGrid(("A", new GridLength(30)), (null, new GridLength())) };
  966. var scope = new Grid();
  967. foreach (var xgrids in grids)
  968. scope.Children.Add(xgrids);
  969. var root = new Grid();
  970. root.UseLayoutRounding = false;
  971. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  972. root.Children.Add(scope);
  973. root.Measure(new Size(50, 50));
  974. root.Arrange(new Rect(new Point(), new Point(50, 50)));
  975. PrintColumnDefinitions(grids[0]);
  976. Assert.Equal(0, grids[0].ColumnDefinitions[0].ActualWidth);
  977. grids[0].ColumnDefinitions[0].SharedSizeGroup = "A";
  978. root.Measure(new Size(51, 51));
  979. root.Arrange(new Rect(new Point(), new Point(51, 51)));
  980. PrintColumnDefinitions(grids[0]);
  981. Assert.Equal(30, grids[0].ColumnDefinitions[0].ActualWidth);
  982. grids[0].ColumnDefinitions[0].SharedSizeGroup = null;
  983. root.Measure(new Size(52, 52));
  984. root.Arrange(new Rect(new Point(), new Point(52, 52)));
  985. PrintColumnDefinitions(grids[0]);
  986. Assert.Equal(0, grids[0].ColumnDefinitions[0].ActualWidth);
  987. }
  988. [Fact]
  989. public void Collection_Changes_Are_Tracked()
  990. {
  991. var grid = CreateGrid(
  992. ("A", new GridLength(20)),
  993. ("A", new GridLength(30)),
  994. ("A", new GridLength(40)),
  995. (null, new GridLength()));
  996. var scope = new Grid();
  997. scope.Children.Add(grid);
  998. var root = new Grid();
  999. root.UseLayoutRounding = false;
  1000. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  1001. root.Children.Add(scope);
  1002. grid.Measure(new Size(200, 200));
  1003. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  1004. PrintColumnDefinitions(grid);
  1005. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(40, cd.ActualWidth));
  1006. grid.ColumnDefinitions.RemoveAt(2);
  1007. // NOTE: THIS IS BROKEN IN WPF
  1008. // grid.Measure(new Size(200, 200));
  1009. // grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  1010. // PrintColumnDefinitions(grid);
  1011. // Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(30, cd.ActualWidth));
  1012. grid.ColumnDefinitions.Insert(1, new ColumnDefinition { Width = new GridLength(30), SharedSizeGroup = "A" });
  1013. grid.Measure(new Size(200, 200));
  1014. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  1015. PrintColumnDefinitions(grid);
  1016. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(30, cd.ActualWidth));
  1017. grid.ColumnDefinitions[1] = new ColumnDefinition { Width = new GridLength(10), SharedSizeGroup = "A" };
  1018. grid.Measure(new Size(200, 200));
  1019. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  1020. PrintColumnDefinitions(grid);
  1021. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(30, cd.ActualWidth));
  1022. grid.ColumnDefinitions[1] = new ColumnDefinition { Width = new GridLength(50), SharedSizeGroup = "A" };
  1023. // NOTE: THIS IS BROKEN IN WPF
  1024. // grid.Measure(new Size(200, 200));
  1025. // grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  1026. // PrintColumnDefinitions(grid);
  1027. // Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  1028. }
  1029. [Fact]
  1030. public void Size_Priorities_Are_Maintained()
  1031. {
  1032. var sizers = new List<Control>();
  1033. var grid = CreateGrid(
  1034. ("A", new GridLength(20)),
  1035. ("A", new GridLength(20, GridUnitType.Auto)),
  1036. ("A", new GridLength(1, GridUnitType.Star)),
  1037. ("A", new GridLength(1, GridUnitType.Star)),
  1038. (null, new GridLength()));
  1039. for (int i = 0; i < 3; i++)
  1040. sizers.Add(AddSizer(grid, i, 6 + i * 6));
  1041. var scope = new Grid();
  1042. scope.Children.Add(grid);
  1043. var root = new Grid();
  1044. root.UseLayoutRounding = false;
  1045. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  1046. root.Children.Add(scope);
  1047. grid.Measure(new Size(100, 100));
  1048. grid.Arrange(new Rect(new Point(), new Point(100, 100)));
  1049. PrintColumnDefinitions(grid);
  1050. // all in group are equal to the first fixed column
  1051. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(20, cd.ActualWidth));
  1052. grid.ColumnDefinitions[0].SharedSizeGroup = null;
  1053. grid.Measure(new Size(100, 100));
  1054. grid.Arrange(new Rect(new Point(), new Point(100, 100)));
  1055. PrintColumnDefinitions(grid);
  1056. // NOTE: THIS IS BROKEN IN WPF
  1057. // Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(6 + 2 * 6, cd.ActualWidth));
  1058. // grid.ColumnDefinitions[1].SharedSizeGroup = null;
  1059. // grid.Measure(new Size(100, 100));
  1060. // grid.Arrange(new Rect(new Point(), new Point(100, 100)));
  1061. // PrintColumnDefinitions(grid);
  1062. // NOTE: THIS IS BROKEN IN WPF
  1063. // all in group are equal to width (MinWidth) of the sizer in the second column
  1064. // Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(6 + 1 * 6, cd.ActualWidth));
  1065. // NOTE: THIS IS BROKEN IN WPF
  1066. // grid.ColumnDefinitions[2].SharedSizeGroup = null;
  1067. // NOTE: THIS IS BROKEN IN WPF
  1068. // grid.Measure(new Size(double.PositiveInfinity, 100));
  1069. // grid.Arrange(new Rect(new Point(), new Point(100, 100)));
  1070. // PrintColumnDefinitions(grid);
  1071. // with no constraint star columns default to the MinWidth of the sizer in the column
  1072. // Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(0, cd.ActualWidth));
  1073. }
  1074. [Fact]
  1075. public void ColumnDefinitions_Collection_Is_ReadOnly()
  1076. {
  1077. var grid = CreateGrid(
  1078. ("A", new GridLength(50)),
  1079. ("A", new GridLength(50)),
  1080. ("A", new GridLength(50)),
  1081. ("A", new GridLength(50)));
  1082. var scope = new Grid();
  1083. scope.Children.Add(grid);
  1084. var root = new Grid();
  1085. root.UseLayoutRounding = false;
  1086. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  1087. root.Children.Add(scope);
  1088. grid.Measure(new Size(200, 200));
  1089. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  1090. PrintColumnDefinitions(grid);
  1091. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(50, cd.ActualWidth));
  1092. grid.ColumnDefinitions[0] = new ColumnDefinition { Width = new GridLength(25), SharedSizeGroup = "A" };
  1093. grid.ColumnDefinitions[1] = new ColumnDefinition { Width = new GridLength(75), SharedSizeGroup = "B" };
  1094. grid.ColumnDefinitions[2] = new ColumnDefinition { Width = new GridLength(75), SharedSizeGroup = "B" };
  1095. grid.ColumnDefinitions[3] = new ColumnDefinition { Width = new GridLength(25), SharedSizeGroup = "A" };
  1096. grid.Measure(new Size(200, 200));
  1097. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  1098. PrintColumnDefinitions(grid);
  1099. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(25, cd.ActualWidth));
  1100. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(75, cd.ActualWidth));
  1101. }
  1102. [Fact]
  1103. public void ColumnDefinitions_Collection_Reset_SharedSizeGroup()
  1104. {
  1105. var grid = CreateGrid(
  1106. ("A", new GridLength(25)),
  1107. ("B", new GridLength(75)),
  1108. ("B", new GridLength(75)),
  1109. ("A", new GridLength(25)));
  1110. var scope = new Grid();
  1111. scope.Children.Add(grid);
  1112. var root = new Grid();
  1113. root.UseLayoutRounding = false;
  1114. root.SetValue(Grid.IsSharedSizeScopeProperty, true);
  1115. root.Children.Add(scope);
  1116. grid.Measure(new Size(200, 200));
  1117. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  1118. PrintColumnDefinitions(grid);
  1119. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "A"), cd => Assert.Equal(25, cd.ActualWidth));
  1120. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == "B"), cd => Assert.Equal(75, cd.ActualWidth));
  1121. grid.ColumnDefinitions[0].SharedSizeGroup = null;
  1122. grid.ColumnDefinitions[0].Width = new GridLength(50);
  1123. grid.ColumnDefinitions[1].SharedSizeGroup = null;
  1124. grid.ColumnDefinitions[1].Width = new GridLength(50);
  1125. grid.ColumnDefinitions[2].SharedSizeGroup = null;
  1126. grid.ColumnDefinitions[2].Width = new GridLength(50);
  1127. grid.ColumnDefinitions[3].SharedSizeGroup = null;
  1128. grid.ColumnDefinitions[3].Width = new GridLength(50);
  1129. grid.Measure(new Size(200, 200));
  1130. grid.Arrange(new Rect(new Point(), new Point(200, 200)));
  1131. PrintColumnDefinitions(grid);
  1132. Assert.All(grid.ColumnDefinitions.Where(cd => cd.SharedSizeGroup == null), cd => Assert.Equal(50, cd.ActualWidth));
  1133. }
  1134. [Fact]
  1135. public void Correct_Grid_Bounds_When_Child_Control_Has_DesiredSize_Larger_Than_Available_Space()
  1136. {
  1137. // Issue #2746
  1138. var grid = new Grid
  1139. {
  1140. RowDefinitions = RowDefinitions.Parse("Auto"),
  1141. Children =
  1142. {
  1143. new TestControl
  1144. {
  1145. MeasureSize = new Size(150, 150),
  1146. }
  1147. }
  1148. };
  1149. var parent = new Decorator { Child = grid };
  1150. parent.Measure(new Size(100, 100));
  1151. parent.Arrange(new Rect(grid.DesiredSize));
  1152. Assert.Equal(new Size(100, 100), grid.Bounds.Size);
  1153. }
  1154. [Theory]
  1155. [InlineData(true)]
  1156. [InlineData(false)]
  1157. public void Changing_Column_Width_Should_Invalidate_Grid(bool setUsingAvaloniaProperty)
  1158. {
  1159. var grid = new Grid { ColumnDefinitions = ColumnDefinitions.Parse("1*,1*") };
  1160. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1161. {
  1162. if (setUsingAvaloniaProperty)
  1163. grid.ColumnDefinitions[0][ColumnDefinition.WidthProperty] = new GridLength(5);
  1164. else
  1165. grid.ColumnDefinitions[0].Width = new GridLength(5);
  1166. });
  1167. }
  1168. [Theory]
  1169. [InlineData(true)]
  1170. [InlineData(false)]
  1171. public void Changing_Column_MinWidth_Should_Invalidate_Grid(bool setUsingAvaloniaProperty)
  1172. {
  1173. var grid = new Grid { ColumnDefinitions = ColumnDefinitions.Parse("1*,1*") };
  1174. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1175. {
  1176. if (setUsingAvaloniaProperty)
  1177. grid.ColumnDefinitions[0][ColumnDefinition.MinWidthProperty] = 5;
  1178. else
  1179. grid.ColumnDefinitions[0].MinWidth = 5;
  1180. });
  1181. }
  1182. [Theory]
  1183. [InlineData(true)]
  1184. [InlineData(false)]
  1185. public void Changing_Column_MaxWidth_Should_Invalidate_Grid(bool setUsingAvaloniaProperty)
  1186. {
  1187. var grid = new Grid { ColumnDefinitions = ColumnDefinitions.Parse("1*,1*") };
  1188. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1189. {
  1190. if (setUsingAvaloniaProperty)
  1191. grid.ColumnDefinitions[0][ColumnDefinition.MaxWidthProperty] = 5;
  1192. else
  1193. grid.ColumnDefinitions[0].MaxWidth = 5;
  1194. });
  1195. }
  1196. [Theory]
  1197. [InlineData(true)]
  1198. [InlineData(false)]
  1199. public void Changing_Row_Height_Should_Invalidate_Grid(bool setUsingAvaloniaProperty)
  1200. {
  1201. var grid = new Grid { RowDefinitions = RowDefinitions.Parse("1*,1*") };
  1202. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1203. {
  1204. if (setUsingAvaloniaProperty)
  1205. grid.RowDefinitions[0][RowDefinition.HeightProperty] = new GridLength(5);
  1206. else
  1207. grid.RowDefinitions[0].Height = new GridLength(5);
  1208. });
  1209. }
  1210. [Theory]
  1211. [InlineData(true)]
  1212. [InlineData(false)]
  1213. public void Changing_Row_MinHeight_Should_Invalidate_Grid(bool setUsingAvaloniaProperty)
  1214. {
  1215. var grid = new Grid { RowDefinitions = RowDefinitions.Parse("1*,1*") };
  1216. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1217. {
  1218. if (setUsingAvaloniaProperty)
  1219. grid.RowDefinitions[0][RowDefinition.MinHeightProperty] = 5;
  1220. else
  1221. grid.RowDefinitions[0].MinHeight = 5;
  1222. });
  1223. }
  1224. [Theory]
  1225. [InlineData(true)]
  1226. [InlineData(false)]
  1227. public void Changing_Row_MaxHeight_Should_Invalidate_Grid(bool setUsingAvaloniaProperty)
  1228. {
  1229. var grid = new Grid { RowDefinitions = RowDefinitions.Parse("1*,1*") };
  1230. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1231. {
  1232. if (setUsingAvaloniaProperty)
  1233. grid.RowDefinitions[0][RowDefinition.MaxHeightProperty] = 5;
  1234. else
  1235. grid.RowDefinitions[0].MaxHeight = 5;
  1236. });
  1237. }
  1238. [Fact]
  1239. public void Adding_Column_Should_Invalidate_Grid()
  1240. {
  1241. var grid = new Grid { ColumnDefinitions = ColumnDefinitions.Parse("1*,1*") };
  1242. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1243. {
  1244. grid.ColumnDefinitions.Add(new ColumnDefinition(new GridLength(5)));
  1245. });
  1246. }
  1247. [Fact]
  1248. public void Adding_Row_Should_Invalidate_Grid()
  1249. {
  1250. var grid = new Grid { RowDefinitions = RowDefinitions.Parse("1*,1*") };
  1251. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1252. {
  1253. grid.RowDefinitions.Add(new RowDefinition(new GridLength(5)));
  1254. });
  1255. }
  1256. [Fact]
  1257. public void Replacing_Columns_Should_Invalidate_Grid()
  1258. {
  1259. var grid = new Grid { ColumnDefinitions = ColumnDefinitions.Parse("1*,1*") };
  1260. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1261. {
  1262. grid.ColumnDefinitions = ColumnDefinitions.Parse("2*,1*");
  1263. });
  1264. }
  1265. [Fact]
  1266. public void Replacing_Rows_Should_Invalidate_Grid()
  1267. {
  1268. var grid = new Grid { RowDefinitions = RowDefinitions.Parse("1*,1*") };
  1269. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1270. {
  1271. grid.RowDefinitions = RowDefinitions.Parse("2*,1*");
  1272. });
  1273. }
  1274. [Fact]
  1275. public void Removing_Column_Should_Invalidate_Grid()
  1276. {
  1277. var grid = new Grid { ColumnDefinitions = ColumnDefinitions.Parse("1*,1*") };
  1278. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1279. {
  1280. grid.ColumnDefinitions.RemoveAt(0);
  1281. });
  1282. }
  1283. [Fact]
  1284. public void Removing_Row_Should_Invalidate_Grid()
  1285. {
  1286. var grid = new Grid { RowDefinitions = RowDefinitions.Parse("1*,1*") };
  1287. Change_Property_And_Verify_Measure_Requested(grid, () =>
  1288. {
  1289. grid.RowDefinitions.RemoveAt(0);
  1290. });
  1291. }
  1292. [Fact]
  1293. public void Removing_Child_Should_Invalidate_Grid_And_Be_Operational()
  1294. {
  1295. var grid = new Grid { ColumnDefinitions = ColumnDefinitions.Parse("*,Auto") };
  1296. grid.Children.Add(new Decorator() { [Grid.ColumnProperty] = 0 });
  1297. grid.Children.Add(new Decorator() { Width = 10, Height = 10, [Grid.ColumnProperty] = 1 });
  1298. var size = new Size(100, 100);
  1299. grid.Measure(size);
  1300. grid.Arrange(new Rect(size));
  1301. Assert.True(grid.IsMeasureValid);
  1302. Assert.True(grid.IsArrangeValid);
  1303. Assert.Equal(90, grid.Children[0].Bounds.Width);
  1304. Assert.Equal(10, grid.Children[1].Bounds.Width);
  1305. grid.Children.RemoveAt(1);
  1306. Assert.False(grid.IsMeasureValid);
  1307. Assert.False(grid.IsArrangeValid);
  1308. grid.Measure(size);
  1309. grid.Arrange(new Rect(size));
  1310. Assert.True(grid.IsMeasureValid);
  1311. Assert.True(grid.IsArrangeValid);
  1312. Assert.Equal(100, grid.Children[0].Bounds.Width);
  1313. }
  1314. [Fact]
  1315. public void Adding_Child_Should_Invalidate_Grid_And_Be_Operational()
  1316. {
  1317. var grid = new Grid { ColumnDefinitions = ColumnDefinitions.Parse("*,Auto") };
  1318. grid.Children.Add(new Decorator() { [Grid.ColumnProperty] = 0 });
  1319. var size = new Size(100, 100);
  1320. grid.Measure(size);
  1321. grid.Arrange(new Rect(size));
  1322. Assert.True(grid.IsMeasureValid);
  1323. Assert.True(grid.IsArrangeValid);
  1324. Assert.Equal(100, grid.Children[0].Bounds.Width);
  1325. grid.Children.Add(new Decorator() { Width = 10, Height = 10, [Grid.ColumnProperty] = 1 });
  1326. Assert.False(grid.IsMeasureValid);
  1327. Assert.False(grid.IsArrangeValid);
  1328. grid.Measure(size);
  1329. grid.Arrange(new Rect(size));
  1330. Assert.True(grid.IsMeasureValid);
  1331. Assert.True(grid.IsArrangeValid);
  1332. Assert.Equal(90, grid.Children[0].Bounds.Width);
  1333. Assert.Equal(10, grid.Children[1].Bounds.Width);
  1334. }
  1335. private static void Change_Property_And_Verify_Measure_Requested(Grid grid, Action change)
  1336. {
  1337. grid.Measure(new Size(100, 100));
  1338. grid.Arrange(new Rect(grid.DesiredSize));
  1339. Assert.True(grid.IsMeasureValid);
  1340. Assert.True(grid.IsArrangeValid);
  1341. change();
  1342. Assert.False(grid.IsMeasureValid);
  1343. Assert.False(grid.IsArrangeValid);
  1344. }
  1345. private class TestControl : Control
  1346. {
  1347. public Size MeasureSize { get; set; }
  1348. protected override Size MeasureOverride(Size availableSize) => MeasureSize;
  1349. }
  1350. }
  1351. }