完全来源于十月的寒流,感谢大佬讲解
依赖属性
由依赖属性提供的属性功能
与字段支持的属性不同,依赖属性扩展了属性的功能。 通常,添加的功能表示或支持以下功能之一:
- 资源
- 数据绑定
- 样式
- 动画
- 元数据重写
- 属性值继承
- WPF 设计器集成
csharp
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
CustomTextBox customTextBox = new CustomTextBox();
customTextBox.IsHightLighted = true;
customTextBox.SetValue(CustomTextBox.IsHightLightedProperty, true);
}
}
public class CustomTextBox : TextBox
{
public bool IsHightLighted
{
get { return (bool)GetValue(IsHightLightedProperty); }
set { SetValue(IsHightLightedProperty, value); }
}
public static readonly DependencyProperty IsHightLightedProperty =
DependencyProperty.Register("IsHightLighted", typeof(bool), typeof(CustomTextBox), new PropertyMetadata(false));
}
csharp
#region HasText
public bool HasText => (bool)GetValue(HasTextProperty);
public static readonly DependencyProperty HasTextProperty;
public static readonly DependencyPropertyKey HasTextPropertyKey;
static CustomTextBox()
{
HasTextPropertyKey = DependencyProperty.RegisterReadOnly(
"HasText",
typeof(bool),
typeof(CustomTextBox),
new PropertyMetadata(false)
);
HasTextProperty = HasTextPropertyKey.DependencyProperty;
}
#endregion
csharp
<Window x:Class="Test_05.MainWindow"
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:Test_05"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<Style TargetType="local:CustomTextBox">
<Style.Triggers>
<Trigger Property="IsHightLighted" Value="True">
<Setter Property="Background" Value="Yellow"></Setter>
</Trigger>
<Trigger Property="IsHightLighted" Value="False">
<Setter Property="Background" Value="Blue"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<local:CustomTextBox Text="Hello World!" FontSize="30" IsHightLighted="True"></local:CustomTextBox>
</StackPanel>
</Window>
附加属性
csharp
<StackPanel>
<!--<local:CustomTextBox Text="Hello World!" FontSize="30" IsHightLighted="True"></local:CustomTextBox>-->
<local:CustomTextBox Text="Hello World!" FontSize="30">
<local:CustomTextBox.IsHightLighted>
true
</local:CustomTextBox.IsHightLighted>
<Grid.Row>1</Grid.Row>
</local:CustomTextBox>
</StackPanel>
<StackPanel>
<local:CustomTextBox x:Name="aoteman" local:TextBoxHelper.Title="this is test" FontSize="30"
Text="{Binding RelativeSource={RelativeSource self}, Path=(local:TextBoxHelper.Title)}"></local:CustomTextBox>
<!--<local:CustomTextBox x:Name="aoteman" FontSize="30"
Text="{Binding RelativeSource={RelativeSource self}, Path=(local:TextBoxHelper.Title)}"></local:CustomTextBox>-->
</StackPanel>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//TextBoxHelper.SetTitle(aoteman, "this is aoteman");
}
}
public class CustomTextBox : TextBox
{
public bool IsHightLighted
{
get { return (bool)GetValue(IsHightLightedProperty); }
set { SetValue(IsHightLightedProperty, value); }
}
public static readonly DependencyProperty IsHightLightedProperty =
DependencyProperty.Register("IsHightLighted", typeof(bool), typeof(CustomTextBox), new PropertyMetadata(false));
public bool HasText => (bool)GetValue(HasTextProperty);
public static readonly DependencyProperty HasTextProperty;
public static readonly DependencyPropertyKey HasTextPropertyKey;
static CustomTextBox()
{
HasTextPropertyKey = DependencyProperty.RegisterReadOnly(
"HasText",
typeof(bool),
typeof(CustomTextBox),
new PropertyMetadata(false)
);
HasTextProperty = HasTextPropertyKey.DependencyProperty;
}
}
public class TextBoxHelper
{
public static string GetTitle(DependencyObject obj)
{
return (string)obj.GetValue(TitleProperty);
}
public static void SetTitle(DependencyObject obj, string value)
{
obj.SetValue(TitleProperty, value);
}
// Using a DependencyProperty as the backing store for Title. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TitleProperty =
DependencyProperty.RegisterAttached("Title", typeof(string), typeof(TextBoxHelper), new PropertyMetadata(""));
}
TextBox HasText