zoukankan      html  css  js  c++  java
  • [WPF系列]-高级部分 Shadowed TextBox

    Download Solution

    ShadowedTextBoxExample.zip (70.3 KB)

    Usage

    <local:ShadowedTextBox Label="First Name" Text="{Binding FirstName}" />

    Styles

    <Style x:Key="shadowedLabelStyle">
        <Setter Property="TextBlock.Foreground" Value="{x:Static SystemColors.ControlDarkBrush}" />
        <Setter Property="FrameworkElement.Opacity" Value="0.8" />
        <Setter Property="TextBlock.FontSize" Value="12" />
        <Setter Property="TextBlock.FontStyle" Value="Italic" />
        <Setter Property="TextBlock.Margin" Value="8,4,4,4" />
    </Style>
    
    <Style TargetType="{x:Type local:ShadowedTextBox}">
        <Setter Property="FontSize" Value="14" />
        <Setter Property="Margin" Value="5,2,2,2" />
        <Setter Property="LabelStyle" Value="{StaticResource shadowedLabelStyle}" />
    </Style>

    ShadowedTextBox.cs

    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    
    namespace ShadowedTextBoxExample
    {
        public class ShadowedTextBox : TextBox
        {
            #region Properties
            public string Label
            {
                get { return (string)GetValue(LabelProperty); }
                set { SetValue(LabelProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for Label.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty LabelProperty =
                DependencyProperty.Register("Label", typeof(string), typeof(ShadowedTextBox), new UIPropertyMetadata("Label"));
    
            public Style LabelStyle
            {
                get { return (Style)GetValue(LabelStyleProperty); }
                set { SetValue(LabelStyleProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for LabelStyle.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty LabelStyleProperty =
                DependencyProperty.Register("LabelStyle", typeof(Style), typeof(ShadowedTextBox), new UIPropertyMetadata(null));
    
    
            public bool HasText
            {
                get { return (bool)GetValue(HasTextProperty); }
                private set { SetValue(HasTextPropertyKey, value); }
            }
    
            private static readonly DependencyPropertyKey HasTextPropertyKey =
                DependencyProperty.RegisterReadOnly("HasText", typeof(bool), typeof(ShadowedTextBox), new PropertyMetadata(false));
            public static readonly DependencyProperty HasTextProperty = HasTextPropertyKey.DependencyProperty;
    
            #endregion
    
            public ShadowedTextBox()
                : base()
            {
            }
    
            AdornerLayer myAdornerLayer;
            AdornerLabel myAdornerLabel;
            public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
    
                myAdornerLayer = AdornerLayer.GetAdornerLayer(this);
                myAdornerLabel = new AdornerLabel(this, this.Label, this.LabelStyle);
                UpdateAdorner(this);
    
                DependencyPropertyDescriptor focusProp = DependencyPropertyDescriptor.FromProperty(FrameworkElement.IsFocusedProperty, typeof(FrameworkElement));
                if (focusProp != null)
                {
                    focusProp.AddValueChanged(this, delegate
                    {
                        UpdateAdorner(this);
                    });
                }
    
                DependencyPropertyDescriptor containsTextProp = DependencyPropertyDescriptor.FromProperty(ShadowedTextBox.HasTextProperty, typeof(ShadowedTextBox));
                if (containsTextProp != null)
                {
                    containsTextProp.AddValueChanged(this, delegate
                    {
                        UpdateAdorner(this);
                    });
                }
            }
    
            protected override void OnTextChanged(TextChangedEventArgs e)
            {
                HasText = this.Text != "";
    
                base.OnTextChanged(e);
            }
    
            protected override void OnDragEnter(DragEventArgs e)
            {
                myAdornerLayer.RemoveAdorners<AdornerLabel>(this); // requires AdornerExtensions.cs
    
                base.OnDragEnter(e);
            }
    
            protected override void OnDragLeave(DragEventArgs e)
            {
                UpdateAdorner(this);
    
                base.OnDragLeave(e);
            }
    
            private void UpdateAdorner(FrameworkElement elem)
            {
                if (((ShadowedTextBox)elem).HasText || elem.IsFocused)
                {
                    // Hide the Shadowed Label
                    this.ToolTip = this.Label;
                    myAdornerLayer.RemoveAdorners<AdornerLabel>(elem);  // requires AdornerExtensions.cs
                }
                else
                {
                    // Show the Shadowed Label
                    this.ToolTip = null;
                    if (!myAdornerLayer.Contains<AdornerLabel>(elem))  // requires AdornerExtensions.cs
                        myAdornerLayer.Add(myAdornerLabel);
                }
            }
        }
    }
  • 相关阅读:
    bash快捷建-光标移到行首、行尾等
    VitualBox中linux系统ping ip能通域名不通的解决办法
    linux下使用tar命令
    Windows平台下Git服务器搭建
    android 在使用studio 编写百度地图中遇到APP Scode码校验失败 问题
    android 开发中 添加库文件 和so 文件的存放位置和添加依赖
    Volley之 JsonRequest 解析JSON 数据
    利用Volley封装好的图片缓存处理加载图片
    使用Volley执行网络数据传输
    android 测试 Monkey 和 MonkeyRunner 的使用
  • 原文地址:https://www.cnblogs.com/HQFZ/p/4269142.html
Copyright © 2011-2022 走看看