TitleTextBox.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using CustomUI.Utils;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using System.Windows.Shapes;
  5. namespace CustomUI
  6. {
  7. public enum TitleOrientationEnum
  8. {
  9. Horizontal,
  10. Vertical,
  11. }
  12. /// <summary>
  13. /// 带标题的文本框
  14. /// </summary>
  15. [TemplatePart(Name = "PART_ClearText", Type = typeof(Path))]
  16. [TemplatePart(Name = "PART_ContentHost", Type = typeof(ScrollViewer))]
  17. public class TitleTextBox : TextBox
  18. {
  19. private Path PART_ClearText;
  20. private ScrollViewer PART_ScrollViewer;
  21. static TitleTextBox()
  22. {
  23. DefaultStyleKeyProperty.OverrideMetadata(typeof(TitleTextBox), new FrameworkPropertyMetadata(typeof(TitleTextBox)));
  24. }
  25. #region 依赖属性
  26. public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title"
  27. , typeof(string), typeof(TitleTextBox));
  28. /// <summary>
  29. /// 标题
  30. /// </summary>
  31. public string Title
  32. {
  33. get { return (string)GetValue(TitleProperty); }
  34. set { SetValue(TitleProperty, value); }
  35. }
  36. public static readonly DependencyProperty IsShowTitleProperty = DependencyProperty.Register("IsShowTitle"
  37. , typeof(bool), typeof(TitleTextBox), new PropertyMetadata(true));
  38. /// <summary>
  39. /// 是否显示文本
  40. /// </summary>
  41. public bool IsShowTitle
  42. {
  43. get { return (bool)GetValue(IsShowTitleProperty); }
  44. set { SetValue(IsShowTitleProperty, value); }
  45. }
  46. public static readonly DependencyProperty CanClearTextProperty = DependencyProperty.Register("CanClearText"
  47. , typeof(bool), typeof(TitleTextBox));
  48. /// <summary>
  49. /// 是否可以清空文本的开关
  50. /// </summary>
  51. public bool CanClearText
  52. {
  53. get { return (bool)GetValue(CanClearTextProperty); }
  54. set { SetValue(CanClearTextProperty, value); }
  55. }
  56. public static readonly DependencyProperty TitleOrientationProperty = DependencyProperty.Register("TitleOrientation"
  57. , typeof(TitleOrientationEnum), typeof(TitleTextBox));
  58. /// <summary>
  59. /// 标题与输入框的排列方式
  60. /// </summary>
  61. public TitleOrientationEnum TitleOrientation
  62. {
  63. get { return (TitleOrientationEnum)GetValue(TitleOrientationProperty); }
  64. set { SetValue(TitleOrientationProperty, value); }
  65. }
  66. #endregion
  67. public override void OnApplyTemplate()
  68. {
  69. base.OnApplyTemplate();
  70. //注册“清空”图标的点击事件
  71. this.PART_ClearText = VisualHelper.FindVisualElement<Path>(this, "PART_ClearText");
  72. if(this.PART_ClearText != null)
  73. {
  74. this.PART_ClearText.MouseLeftButtonDown += PART_ClearText_MouseLeftButtonDown;
  75. }
  76. this.PART_ScrollViewer = VisualHelper.FindVisualElement<ScrollViewer>(this, "PART_ContentHost");
  77. //监听TextBox的鼠标滚轮滚动事件
  78. this.PreviewMouseWheel += TitleTextBox_PreviewMouseWheel;
  79. }
  80. /// <summary>
  81. /// 设置TextBox中的ScrollViewer的样式之后就不能用滚轮滚动滚动条了,不知道为什么,因此在此做额外处理
  82. /// </summary>
  83. /// <param name="sender"></param>
  84. /// <param name="e"></param>
  85. private void TitleTextBox_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
  86. {
  87. if(this.TitleOrientation == TitleOrientationEnum.Vertical && this.PART_ScrollViewer != null)
  88. {
  89. this.PART_ScrollViewer.ScrollToVerticalOffset(this.PART_ScrollViewer.VerticalOffset - e.Delta);
  90. }
  91. }
  92. /// <summary>
  93. /// 点击清空按钮后,清空文本框中的文本
  94. /// </summary>
  95. /// <param name="sender"></param>
  96. /// <param name="e"></param>
  97. private void PART_ClearText_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
  98. {
  99. this.Text = string.Empty;
  100. }
  101. }
  102. }