ListBoxTests_Single.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // Copyright (c) The Perspex Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System.Linq;
  4. using Perspex.Controls.Presenters;
  5. using Perspex.Controls.Templates;
  6. using Perspex.Input;
  7. using Perspex.LogicalTree;
  8. using Perspex.Styling;
  9. using Perspex.VisualTree;
  10. using Xunit;
  11. namespace Perspex.Controls.UnitTests
  12. {
  13. public class ListBoxTests_Single
  14. {
  15. [Fact]
  16. public void Focusing_Item_With_Tab_Should_Not_Select_It()
  17. {
  18. var target = new ListBox
  19. {
  20. Template = new FuncControlTemplate(CreateListBoxTemplate),
  21. Items = new[] { "Foo", "Bar", "Baz " },
  22. };
  23. ApplyTemplate(target);
  24. target.Presenter.Panel.Children[0].RaiseEvent(new GotFocusEventArgs
  25. {
  26. RoutedEvent = InputElement.GotFocusEvent,
  27. NavigationMethod = NavigationMethod.Tab,
  28. });
  29. Assert.Equal(-1, target.SelectedIndex);
  30. }
  31. [Fact]
  32. public void Focusing_Item_With_Arrow_Key_Should_Select_It()
  33. {
  34. var target = new ListBox
  35. {
  36. Template = new FuncControlTemplate(CreateListBoxTemplate),
  37. Items = new[] { "Foo", "Bar", "Baz " },
  38. };
  39. ApplyTemplate(target);
  40. target.Presenter.Panel.Children[0].RaiseEvent(new GotFocusEventArgs
  41. {
  42. RoutedEvent = InputElement.GotFocusEvent,
  43. NavigationMethod = NavigationMethod.Directional,
  44. });
  45. Assert.Equal(0, target.SelectedIndex);
  46. }
  47. [Fact]
  48. public void Clicking_Item_Should_Select_It()
  49. {
  50. var target = new ListBox
  51. {
  52. Template = new FuncControlTemplate(CreateListBoxTemplate),
  53. Items = new[] { "Foo", "Bar", "Baz " },
  54. };
  55. ApplyTemplate(target);
  56. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressedEventArgs
  57. {
  58. RoutedEvent = InputElement.PointerPressedEvent,
  59. MouseButton = MouseButton.Left,
  60. });
  61. Assert.Equal(0, target.SelectedIndex);
  62. }
  63. [Fact]
  64. public void Clicking_Selected_Item_Should_Not_Deselect_It()
  65. {
  66. var target = new ListBox
  67. {
  68. Template = new FuncControlTemplate(CreateListBoxTemplate),
  69. Items = new[] { "Foo", "Bar", "Baz " },
  70. };
  71. ApplyTemplate(target);
  72. target.SelectedIndex = 0;
  73. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressedEventArgs
  74. {
  75. RoutedEvent = InputElement.PointerPressedEvent,
  76. MouseButton = MouseButton.Left,
  77. });
  78. Assert.Equal(0, target.SelectedIndex);
  79. }
  80. [Fact]
  81. public void Clicking_Item_Should_Select_It_When_SelectionMode_Toggle()
  82. {
  83. var target = new ListBox
  84. {
  85. Template = new FuncControlTemplate(CreateListBoxTemplate),
  86. Items = new[] { "Foo", "Bar", "Baz " },
  87. SelectionMode = SelectionMode.Single | SelectionMode.Toggle,
  88. };
  89. ApplyTemplate(target);
  90. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressedEventArgs
  91. {
  92. RoutedEvent = InputElement.PointerPressedEvent,
  93. MouseButton = MouseButton.Left,
  94. });
  95. Assert.Equal(0, target.SelectedIndex);
  96. }
  97. [Fact]
  98. public void Clicking_Selected_Item_Should_Deselect_It_When_SelectionMode_Toggle()
  99. {
  100. var target = new ListBox
  101. {
  102. Template = new FuncControlTemplate(CreateListBoxTemplate),
  103. Items = new[] { "Foo", "Bar", "Baz " },
  104. SelectionMode = SelectionMode.Toggle,
  105. };
  106. ApplyTemplate(target);
  107. target.SelectedIndex = 0;
  108. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressedEventArgs
  109. {
  110. RoutedEvent = InputElement.PointerPressedEvent,
  111. MouseButton = MouseButton.Left,
  112. });
  113. Assert.Equal(-1, target.SelectedIndex);
  114. }
  115. [Fact]
  116. public void Clicking_Selected_Item_Should_Not_Deselect_It_When_SelectionMode_ToggleAlwaysSelected()
  117. {
  118. var target = new ListBox
  119. {
  120. Template = new FuncControlTemplate(CreateListBoxTemplate),
  121. Items = new[] { "Foo", "Bar", "Baz " },
  122. SelectionMode = SelectionMode.Toggle | SelectionMode.AlwaysSelected,
  123. };
  124. ApplyTemplate(target);
  125. target.SelectedIndex = 0;
  126. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressedEventArgs
  127. {
  128. RoutedEvent = InputElement.PointerPressedEvent,
  129. MouseButton = MouseButton.Left,
  130. });
  131. Assert.Equal(0, target.SelectedIndex);
  132. }
  133. [Fact]
  134. public void Clicking_Another_Item_Should_Select_It_When_SelectionMode_Toggle()
  135. {
  136. var target = new ListBox
  137. {
  138. Template = new FuncControlTemplate(CreateListBoxTemplate),
  139. Items = new[] { "Foo", "Bar", "Baz " },
  140. SelectionMode = SelectionMode.Single | SelectionMode.Toggle,
  141. };
  142. ApplyTemplate(target);
  143. target.SelectedIndex = 1;
  144. target.Presenter.Panel.Children[0].RaiseEvent(new PointerPressedEventArgs
  145. {
  146. RoutedEvent = InputElement.PointerPressedEvent,
  147. MouseButton = MouseButton.Left,
  148. });
  149. Assert.Equal(0, target.SelectedIndex);
  150. }
  151. [Fact]
  152. public void Setting_Item_IsSelected_Sets_ListBox_Selection()
  153. {
  154. var target = new ListBox
  155. {
  156. Template = new FuncControlTemplate(CreateListBoxTemplate),
  157. Items = new[] { "Foo", "Bar", "Baz " },
  158. };
  159. ApplyTemplate(target);
  160. ((ListBoxItem)target.GetLogicalChildren().ElementAt(1)).IsSelected = true;
  161. Assert.Equal("Bar", target.SelectedItem);
  162. Assert.Equal(1, target.SelectedIndex);
  163. }
  164. private Control CreateListBoxTemplate(ITemplatedControl parent)
  165. {
  166. return new ScrollViewer
  167. {
  168. Template = new FuncControlTemplate(CreateScrollViewerTemplate),
  169. Content = new ItemsPresenter
  170. {
  171. Name = "PART_ItemsPresenter",
  172. [~ItemsPresenter.ItemsProperty] = parent.GetObservable(ItemsControl.ItemsProperty),
  173. }
  174. };
  175. }
  176. private Control CreateScrollViewerTemplate(ITemplatedControl parent)
  177. {
  178. return new ScrollContentPresenter
  179. {
  180. Name = "PART_ContentPresenter",
  181. [~ContentPresenter.ContentProperty] = parent.GetObservable(ContentControl.ContentProperty),
  182. };
  183. }
  184. private void ApplyTemplate(ListBox target)
  185. {
  186. // Apply the template to the ListBox itself.
  187. target.ApplyTemplate();
  188. // Then to its inner ScrollViewer.
  189. var scrollViewer = (ScrollViewer)target.GetVisualChildren().Single();
  190. scrollViewer.ApplyTemplate();
  191. // Then make the ScrollViewer create its child.
  192. ((ContentPresenter)scrollViewer.Presenter).UpdateChild();
  193. // Now the ItemsPresenter should be reigstered, so apply its template.
  194. target.Presenter.ApplyTemplate();
  195. }
  196. }
  197. }