首頁 > 後端開發 > C++ > 如何使用附件的屬性在WPF文本框中創建一個消失的水印?

如何使用附件的屬性在WPF文本框中創建一個消失的水印?

Patricia Arquette
發布: 2025-01-29 23:01:10
原創
593 人瀏覽過

此代碼使用附件屬性在WPF文本框中創建一個消失的水印。讓我們重構並改進代碼以清晰度和可維護性。 原始代碼具有一定的冗餘,可以簡化。

>

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

文本框中的水印

這個改進的示例演示了在用戶開始鍵入時消失的文本框中創建佔位符文本(水印)。 我們將利用附加的屬性來清潔可重複使用的解決方案。

>

1。改進的附件和水印服務:

>
<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方法處理基於文本框的文本顯示和隱藏水印的邏輯。
  • 刪除冗餘:原始代碼具有多個重複的代碼塊。此版本簡化了邏輯。
  • 改進的類型安全:該代碼現在明確檢查>類型,避免了潛在的鑄造異常。 TextBox
  • linq用法:使用>簡化了裝飾物的去除。 OfType<WatermarkAdorner>()
  • 更清晰的結構:
  • 該代碼更好地組織到邏輯部分。 >
  • 刪除了不必要的邊距:
  • >通過在水印中造型更好地處理邊距。 TextBlock
  • 在實現相同功能的同時,此改進的版本更有效,可讀和可維護。 請記住,在
中添加適當的樣式,以控制其外觀和定位

>。 TextBlock

以上是如何使用附件的屬性在WPF文本框中創建一個消失的水印?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板