WPF教程:附加属性

一、附加属性的特点
1、特殊的依赖属性
2、用于非定义该属性的类 例如Grid面板的RowDefinition、ColumnDefinition、Canvas面板的Left、Right
DockPanel面板的Dock都是附加属性。

二、附加属性的定义

1、声明数据属性变量。 public static 的DependencyProperty类型的变量。
2、在属性系统中进行注册,使用DependencyProperty.RegisterAttached()方法来注册,方法参数和注册依赖属性时Register()方法的参数一致。
3、调用静态方法设置和获取属性值。通过调用DependencyObject的SetValue()和GetValue()方法来设置和获取属性的值。
两个方法应该命名为SetPropertyName()方法和GetPropertyName()方法。

三、示例演示附加属性

实现的功能,窗体字体的大小随TextBox控件里面输入的值的大小而改变。

1、新建WPF版的用户控件,命名为“MyDependencyProperty”,在用户控件里面添加TextBox和TextBlock控件

XAML代码:

 1 <UserControl x:Class="WPFDependencyProperty.MyDependencyProperty"
 2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 6              xmlns:p="clr-namespace:WPFDependencyProperty"
 7              mc:Ignorable="d"
 8              d:DesignHeight="300" d:DesignWidth="300">
 9     <Grid>
10         <StackPanel>
11             <TextBox p:MyDependencyProperty.MyAttachedFontSize="{Binding Path=Text,
12                 RelativeSource={RelativeSource Mode=Self}}" ></TextBox>
13             <TextBlock>通过附加属性修改FontSize的大小</TextBlock>
14         </StackPanel>
15     </Grid>
16 </UserControl>

设计界面:

2、、在MyDependencyProperty.xaml.cs文件里面添加附件属性,附件属性的名称为MyAttachedFontSize,使用快捷方式创建附件属性:输入propa,连续按两下Tab健。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows;
 7 using System.Windows.Controls;
 8 using System.Windows.Data;
 9 using System.Windows.Documents;
10 using System.Windows.Input;
11 using System.Windows.Media;
12 using System.Windows.Media.Imaging;
13 using System.Windows.Navigation;
14 using System.Windows.Shapes;
15
16 namespace WPFDependencyProperty
17 {
18     /// <summary>
19     /// MyDependencyProperty.xaml 的交互逻辑
20     /// </summary>
21     public partial class MyDependencyProperty : UserControl
22     {
23         public MyDependencyProperty()
24         {
25             InitializeComponent();
26         }
27
28
29
30         public static int GetMyAttachedFontSize(DependencyObject obj)
31         {
32             return (int)obj.GetValue(MyAttachedFontSizeProperty);
33         }
34
35         public static void SetMyAttachedFontSize(DependencyObject obj, int value)
36         {
37             obj.SetValue(MyAttachedFontSizeProperty, value);
38         }
39
40         // Using a DependencyProperty as the backing store for MyAttachedFontSize.  This enables animation, styling, binding, etc...
41         public static readonly DependencyProperty MyAttachedFontSizeProperty =
42             DependencyProperty.RegisterAttached("MyAttachedFontSize", typeof(int), typeof(MyDependencyProperty),
43             new PropertyMetadata((s, e) =>
44             {
45                 //获取MyDependencyProperty用户控件,s代表Textbox,
46                 //MyDependencyProperty用户控件是TextBox的父级的父级的父级控件
47                 var mdp = (((s as FrameworkElement).Parent as FrameworkElement).Parent
48                     as FrameworkElement).Parent as MyDependencyProperty;
49                 //更改用户控件的FontSize的值
50                 if (mdp != null && e.NewValue != null)
51                 {
52                     var fontsize = 9;
53                     int.TryParse(e.NewValue.ToString(), out fontsize);
54                     mdp.FontSize = fontsize;
55                 }
56             }));
57
58
59     }
60 }

3、在主界面测试附件属性

 1 <Window x:Class="WPFDependencyProperty.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4        xmlns:p="clr-namespace:WPFDependencyProperty"
 5         Title="MainWindow" Height="350" Width="525" WindowStartupLocation="CenterScreen">
 6     <Grid >
 7         <StackPanel>
 8             <TextBlock>请输入字体的大小</TextBlock>
 9             <p:MyDependencyProperty></p:MyDependencyProperty>
10         </StackPanel>
11     </Grid>
12 </Window>

程序运行效果:

在TextBox里面输入3:

在TextBox里面输入30:

时间: 2024-10-12 01:41:24

WPF教程:附加属性的相关文章

Unity3D嵌入WPF教程

Unity3D嵌入WPF教程 创建一个 类库工程 创建一个 WindowForm 自定义控件 (UserControl) 1).引入 UntiyWebPlayer COM 组件 2).将 这个组件拖到 UserControl 里, 并将 Dock属性设置为 Fill 让它充满整个控件 3)之后删除UntiyWebPlayer,生成文件 3).在程序中添加一个类对 UnityWebPlayer 的Public引用. 这样做的目的是,之后可以对其进行操作,(也可不添加) 4).生成 , 在 bin

WPF 使用附加属性增加控件属性

原文:WPF 使用附加属性增加控件属性 使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活 一.自定义附加属性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

WPF Adorner+附加属性 实现控件友好提示

标题太空泛,直接上图 无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成. 例如WPF自带的控件上要加这样的效果,首先继承自原控件然后重写是可以的,但是控件类型太多,重写不过来.这个时候我们唯一能添加的只有附加属性了. 利用附加属性的属性变更事件PropertyChangedCallBack,我们可以获取到宿主对象即Button,然后就可以往Button上加入我们自定义的Adorner了.再添加一个附加属性

WPF教程005 - Timeline时间轴控件的实现

效果图: 由于整个控件是实现之后才写的教程,因此这里记录的代码是最终实现后的,前后会引用到其他的一些依赖属性或者代码,需要阅读整篇文章. 1.确定Timeline继承的基类 从效果图中可以看到,时间轴都是由一节一节的子节点组成的,这个很容易联想到我们应该将Timeline继承自ItemsControl.之外仔细观察效果图,可以发现第一项的时间轴节点与其他都不同,而且拆解每一个子项,发现都是由一个圆圈和一个竖线组成,但是最后一项和上面的都不同,少了一个竖线,因此为了控制这些样式,我们需要重新定义一

WPF通过附加属性控制窗口关闭

场景1 当使用 ShowDialog() 方式显示窗口时,通过定义附加属性的方式可实现在 ViewModel 中进行数据绑定(bool?)来控制子窗口的显示和关闭 public class ExWindow { public static bool? GetDialogResult(DependencyObject obj) { return (bool?)obj.GetValue(DialogResultProperty); } public static void SetDialogResu

(WPF)附加属性

<Window x:Class="DeepXAML.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:DeepXAML" xmlns:sys="

WPF教程四;布局之Canvas面板

Canvas:画布面板 画布,用于完全控制每个元素的精确位置.他是布局控件中最为简单的一种,直接将元素放到指定位置,主要来布置图面.使用Canvas,必须指定一个子元素的位置(相对于画布),否则所有元素都将出现在画布的左上角.调整位置用Left.Right.Top和Bottom四个附加属性.如果Canvas是窗口主元素(即最外层的布局面板是Canvas),用户改变窗口大小时,Canvas也会随之变化,子元素的位置也会随之移动,以保证相对于Canvas的位置属性不变.     Canvas允许子元

WPF教程:依赖属性

一.什么是依赖属性 依赖属性就是一种自己可以没有值,并且可以通过绑定从其他数据源获取值.依赖属性可支持WPF中的样式设置.数据绑定.继承.动画及默认值. 将所有的属性都设置为依赖属性并不总是正确的解决方案,具体取决于其应用场景.有时,使用私有字段实现属性的典型方法便能满足要求.MSDN中给出了下面几种应用依赖属性的场景: 1. 希望可在样式中设置属性. 2. 希望属性支持数据绑定. 3. 希望可使用动态资源引用设置属性. 4. 希望从元素树中的父元素自动继承属性值. 5. 希望属性可进行动画处理

WPF教程:MVVM模式的理解与应用

一.  什么是MVVM模式 MVVM是Model-View-ViewModel的简写.微软的WPF带来了新的技术体验,如Silverlight.音频.视频.3D.动画--.这导致了软件UI层更加细节化.可定制化.同时,在技术层面,WPF也带来了诸如Binding.Dependency Property.Routed Events.Command.DataTemplate.ControlTemplate等新特性.MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-