>백엔드 개발 >C++ >첨부 된 속성을 사용하여 WPF 텍스트 상자에서 사라지는 워터 마크를 만드는 방법은 무엇입니까?

첨부 된 속성을 사용하여 WPF 텍스트 상자에서 사라지는 워터 마크를 만드는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-29 23:01:10650검색

이 코드는 첨부 된 속성을 사용하여 WPF 텍스트 상자에서 사라지는 워터 마크를 만듭니다. 명확성과 유지 가능성을위한 코드를 리팩터링하고 개선합시다. 원래 코드는 약간의 중복성이 있으며 단순화 될 수 있습니다.

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

Watermark in TextBox

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.