C#WPF绑定DependencyProperty不工作文本框

时间:2017-11-04 20:04:34

标签: c# wpf xaml property-binding

我在WPF文本框中创建占位符。我在stackoverflow中得到了提示代码。

使用静态提示工作代码

<Window x:Class="App.Test"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:App"
            mc:Ignorable="d"
            Title="Test" Height="300" Width="300">
        <Window.Resources>
            <Style x:Key="TextBoxWithHintStyle"  TargetType="TextBox" xmlns:sys="clr-namespace:System;assembly=mscorlib">
                <Style.Resources>
                    <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
                        <VisualBrush.Visual>
                            <Label Content="search" Foreground="LightGray" />
                        </VisualBrush.Visual>
                    </VisualBrush>
                </Style.Resources>
                <Style.Triggers>
                    <Trigger Property="Text" Value="{x:Static sys:String.Empty}">
                        <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
                    </Trigger>
                    <Trigger Property="Text" Value="{x:Null}">
                        <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
                    </Trigger>
                    <Trigger Property="IsKeyboardFocused" Value="True">
                        <Setter Property="Background" Value="White" />
                    </Trigger>
                </Style.Triggers>
            </Style>

        </Window.Resources>

        <Grid>
            <TextBox Style="{StaticResource TextBoxWithHintStyle}" Height="auto" Padding="5px" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="auto" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch"/>
        </Grid>
    </Window>

我正在自定义它,因此它适用于所有Textbox。

XAML文件:

<Window x:Class="App.Test"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:App"
        mc:Ignorable="d"
        Title="Test" Height="300" Width="300">
    <Window.Resources>
        <Style x:Key="TextBoxWithHintStyle"  TargetType="TextBox" xmlns:sys="clr-namespace:System;assembly=mscorlib">
            <Style.Resources>
                <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
                    <VisualBrush.Visual>
                        <Label Content="{Binding Path=(local:TextBoxWithHint.Watermark),RelativeSource={RelativeSource Self}}" Foreground="LightGray" />
                    </VisualBrush.Visual>
                </VisualBrush>
            </Style.Resources>
            <Style.Triggers>
                <Trigger Property="Text" Value="{x:Static sys:String.Empty}">
                    <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
                </Trigger>
                <Trigger Property="Text" Value="{x:Null}">
                    <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
                </Trigger>
                <Trigger Property="IsKeyboardFocused" Value="True">
                    <Setter Property="Background" Value="White" />
                </Trigger>
            </Style.Triggers>
        </Style>

    </Window.Resources>

    <Grid>
        <TextBox Style="{StaticResource TextBoxWithHintStyle}" local:TextBoxWithHint.Watermark="Search" Height="auto" Padding="5px" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="auto" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch"/>
    </Grid>
</Window>

具有DependecyProperty类的TextBox

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace App
{
    public class TextBoxWithHint : TextBox
    {
        public static string GetWatermark(DependencyObject obj)
        {
            return (string)obj.GetValue(WatermarkProperty);
        }

        public static void SetWatermark(DependencyObject obj, string value)
        {
            obj.SetValue(WatermarkProperty, value);
        }

        public static readonly DependencyProperty WatermarkProperty =
            DependencyProperty.RegisterAttached("Watermark", typeof(string), typeof(TextBoxWithHint), new UIPropertyMetadata(string.Empty));
    }
}

所以我想要用xaml文件编写的动态提示。有人可以告诉我这有什么问题。我希望多次使用Textbox,并在项目中使用不同的提示。

1 个答案:

答案 0 :(得分:0)

我很想在代码隐藏中作为一个自定义控件执行此操作:

public class TextBoxWithHint : TextBox
{
    private readonly VisualBrush vb;

    public static string GetWatermark(DependencyObject obj)
    {
        return (string)obj.GetValue(WatermarkProperty);
    }

    public static void SetWatermark(DependencyObject obj, string value)
    {
        obj.SetValue(WatermarkProperty, value);
    }

    public static readonly DependencyProperty WatermarkProperty =
        DependencyProperty.RegisterAttached("Watermark", typeof(string), typeof(TextBoxWithHint), new UIPropertyMetadata(string.Empty));

    public TextBoxWithHint()
    {
        Label l = new Label { Foreground = new SolidColorBrush(Colors.LightGray) };

        Binding b = new Binding
        {
            Source = this,
            Path = new PropertyPath("Watermark"),
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        };

        BindingOperations.SetBinding(l, ContentControl.ContentProperty, b);

        vb = new VisualBrush(l) { AlignmentX = AlignmentX.Left, AlignmentY = AlignmentY.Center, Stretch = Stretch.None };

        GotKeyboardFocus += TextBoxWithHint_GotKeyboardFocus;
        LostKeyboardFocus += TextBoxWithHint_LostKeyboardFocus;

        Initialized += TextBoxWithHint_Initialized;
    }

    private void TextBoxWithHint_Initialized(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(Text) && !IsKeyboardFocused) SetBackgroundWatermark();
        else SetBackgroundPlain();
    }

    private void TextBoxWithHint_LostKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
    {
        if (string.IsNullOrEmpty(Text) && Background.GetType() == typeof(SolidColorBrush)) SetBackgroundWatermark();
    }

    private void TextBoxWithHint_GotKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
    {
        if (Background.GetType() == typeof(VisualBrush)) SetBackgroundPlain();
    }

    private void SetBackgroundWatermark() { Background = vb; }
    private void SetBackgroundPlain() { Background = new SolidColorBrush(Colors.White); }
}

然后,您将在XAML中引用此控件(无需样式):

<local:TextBoxWithHint Watermark="Search" ...