首先来一发图:

TextBox自定义控件

今天主要说的textBox内部给予提示:

使用自定义控件方式:TextBoxTip继承TextBox

利用TextBox的背景画刷功能

VisualBrush是一种比较特殊的笔刷,它的功能仍然是用来给元素填充图案,但它的内容却可以是各种控件。

你可以将其理解为一个普通的容器,但在其内部的所有控件都会失去交互能力,而只保留显示能力。

                                    <TextBox.Background>
                                        <VisualBrush Stretch="None" AlignmentX="Left">
                                            <VisualBrush.Transform>
                                                <TranslateTransform X="5" Y="0"/>
                                            </VisualBrush.Transform>
                                            <VisualBrush.Visual>
                                                <TextBlock x:Name="PART_EmptyText" Grid.Column="0" Text="{TemplateBinding TooTipText}" 
                                            FontSize="12"   Visibility="Collapsed" Foreground="{TemplateBinding Foreground}"  
                                                   Focusable="False"/>
                                            </VisualBrush.Visual>
                                        </VisualBrush>
                                    </TextBox.Background>

在背景色上给予一个画刷,使用textBlock来显示要提示的文本。

使用条件触发控制画刷的显示与隐藏:

                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding Path=IsFocused,ElementName=PART_Text}" Value="False"/>
                                <Condition Binding="{Binding Path=Text,ElementName=PART_Text}" Value=""/>
                            </MultiDataTrigger.Conditions>
                            <Setter TargetName="PART_EmptyText" Property="Visibility" Value="Visible"/>
                        </MultiDataTrigger>

当TextBox失去焦点和文本内容为“”等两个条件成立时 画刷显示。

文本内部还放置了一个Button用于Clear

                        <Button  Grid.Column="1" 
                                 x:Name="Xbtn"
                                 ToolTip="Clear"
                                 Visibility="{TemplateBinding XButtonVisibility}"
                                 VerticalAlignment="Center" Margin="7 0"
                                 Command="{x:Static local:TextBoxTip.XButtonCommand}"
                                 Style="{StaticResource XCloseButton}"/>

给Button注册Command事件

        /// <summary>
        /// Since we're using RoutedCommands for the increase/decrease commands, we need to
        /// register them with the command manager so we can tie the events
        /// to callbacks in the control.
        /// </summary>
        private static void InitializeCommands()
        {
            XButtonCommand = new RoutedCommand("XButtonCommand", typeof(TextBoxTip));
            CommandManager.RegisterClassCommandBinding(typeof(TextBoxTip),
                  new CommandBinding(XButtonCommand, CloseButtonCommand));
        }

        public static void CloseButtonCommand(Object sender, ExecutedRoutedEventArgs e)
        {
            TextBoxTip control = sender as TextBoxTip;
            if (control != null)
            {
                control.Text = "";
            }
        }

        public static RoutedCommand XButtonCommand { set; get; }
View Code

相关文章: