ホームページ >バックエンド開発 >C++ >添付のプロパティを使用してWPFテキストボックスに消える透かしを作成する方法は?

添付のプロパティを使用してWPFテキストボックスに消える透かしを作成する方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-29 23:01:10595ブラウズ

このコードは、添付のプロパティを使用してWPFテキストボックスに消える透かしを作成します。明確さと保守性のためにコードをリファクタリングして改善しましょう。 元のコードにはある程度の冗長性があり、簡素化される可能性があります。

How to Create a Disappearing Watermark in a WPF TextBox Using Attached Properties?

テキストボックスの透かし

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>

改善点:

  • 単純化されたイベントの処理:修正コードは、テキストボックスにLoadedTextChangedイベントのみを使用して、より簡潔で理解しやすくします。 GotFocusメソッドは、テキストボックスのテキストに基づいて透かしを表示および隠すためのロジックを処理します。 UpdateWatermarkVisibility
  • 削除された冗長性:
  • 元のコードには、いくつかの重複したコードブロックがありました。このバージョンは、ロジックを合理化します。
  • タイプの改善された安全性:
  • コードは、潜在的な鋳造の例外を回避し、タイプを明示的にチェックしました。 TextBoxlinqの使用法:
  • を使用すると、装飾者の除去が簡素化されます。 OfType<WatermarkAdorner>()Clearer Structure:
  • The code is better organized into logical sections.
  • 不要なマージンを削除:
  • マージンは、ウォーターマーク内のスタイリングを通じてより適切に処理されます。
  • この改善されたバージョンは、同じ機能を達成しながら、より効率的で読みやすく、保守可能です。

以上が添付のプロパティを使用してWPFテキストボックスに消える透かしを作成する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。