このコードは、添付のプロパティを使用して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:
<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>
2。 Watermarkadornerクラス(マイナーな改善):
<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>
3。 XAMLの使用:
<code class="language-xaml"><TextBox x:Name="SearchTextBox"> <WatermarkService.Watermark> <TextBlock>Type here to search text</TextBlock> </WatermarkService.Watermark> </TextBox></code>
改善点:
Loaded
、TextChanged
イベントのみを使用して、より簡潔で理解しやすくします。 GotFocus
メソッドは、テキストボックスのテキストに基づいて透かしを表示および隠すためのロジックを処理します。
UpdateWatermarkVisibility
TextBox
linqの使用法:OfType<WatermarkAdorner>()
Clearer Structure:以上が添付のプロパティを使用してWPFテキストボックスに消える透かしを作成する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。