이 코드는 첨부 된 속성을 사용하여 WPF 텍스트 상자에서 사라지는 워터 마크를 만듭니다. 명확성과 유지 가능성을위한 코드를 리팩터링하고 개선합시다. 원래 코드는 약간의 중복성이 있으며 단순화 될 수 있습니다.
This improved example demonstrates creating a placeholder text (watermark) in a TextBox that disappears when the user starts typing. We'll utilize attached properties for a clean and reusable solution.
1. Improved Attached Property and Watermark Service:2. Watermarkadorner Class (사소한 개선) :
3. XAML 사용 :<code class="language-csharp">public static class WatermarkService { public static readonly DependencyProperty WatermarkProperty = DependencyProperty.RegisterAttached("Watermark", typeof(object), typeof(WatermarkService), new FrameworkPropertyMetadata(null, OnWatermarkChanged)); public static object GetWatermark(DependencyObject obj) => obj.GetValue(WatermarkProperty); public static void SetWatermark(DependencyObject obj, object value) => obj.SetValue(WatermarkProperty, value); private static void OnWatermarkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (!(d is TextBox textBox)) return; textBox.Loaded += TextBox_Loaded; textBox.TextChanged += TextBox_TextChanged; textBox.GotFocus += TextBox_GotFocus; } private static void TextBox_Loaded(object sender, RoutedEventArgs e) => UpdateWatermarkVisibility((TextBox)sender); private static void TextBox_TextChanged(object sender, TextChangedEventArgs e) => UpdateWatermarkVisibility((TextBox)sender); private static void TextBox_GotFocus(object sender, RoutedEventArgs e) => UpdateWatermarkVisibility((TextBox)sender); private static void UpdateWatermarkVisibility(TextBox textBox) { RemoveWatermark(textBox); if (string.IsNullOrEmpty(textBox.Text)) { ShowWatermark(textBox); } } private static void RemoveWatermark(TextBox textBox) { var layer = AdornerLayer.GetAdornerLayer(textBox); if (layer != null) { var adorners = layer.GetAdorners(textBox); if (adorners != null) { foreach (var adorner in adorners.OfType<WatermarkAdorner>()) { layer.Remove(adorner); } } } } private static void ShowWatermark(TextBox textBox) { var layer = AdornerLayer.GetAdornerLayer(textBox); if (layer != null) { layer.Add(new WatermarkAdorner(textBox, GetWatermark(textBox))); } } }</code>
개선 : 단순화 된 이벤트 처리 :
> 개정 된 코드는 텍스트 상자에 , 및 이벤트 만 사용하므로 더 간결하고 이해하기 쉽습니다.<code class="language-csharp">internal class WatermarkAdorner : Adorner { private readonly ContentPresenter contentPresenter; public WatermarkAdorner(UIElement adornedElement, object watermark) : base(adornedElement) { IsHitTestVisible = false; contentPresenter = new ContentPresenter { Content = watermark, Opacity = 0.5 }; // Removed unnecessary margin setting; let the watermark style handle positioning. } protected override int VisualChildrenCount => 1; protected override Visual GetVisualChild(int index) => contentPresenter; protected override Size MeasureOverride(Size constraint) { contentPresenter.Measure(AdornedElement.RenderSize); return AdornedElement.RenderSize; } protected override Size ArrangeOverride(Size finalSize) { contentPresenter.Arrange(new Rect(finalSize)); return finalSize; } }</code>메소드는 TextBox의 텍스트를 기반으로 워터 마크를 보여주고 숨기는 논리를 처리합니다.
제거 된 중복성 : 원래 코드에는 여러 개의 복제 된 코드 블록이 있습니다. 이 버전은 논리를 간소화합니다. 개선 된 유형 안전 : 코드는 이제
유형을 명시 적으로 점검하여 잠재적 캐스팅 예외를 피합니다. LINQ 사용 : 사용<code class="language-xaml"><TextBox x:Name="SearchTextBox"> <WatermarkService.Watermark> <TextBlock>Type here to search text</TextBlock> </WatermarkService.Watermark> </TextBox></code>는 장식 자의 제거를 단순화합니다 명확한 구조 :
코드는 논리 섹션으로 더 잘 구성됩니다. 제거 불필요한 마진 제거 : 워터 마크 내에서 스타일링을 통해 마진이 더 잘 처리됩니다.
위 내용은 첨부 된 속성을 사용하여 WPF 텍스트 상자에서 사라지는 워터 마크를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!