如何在现有控件上创建Dependency属性?

时间:2010-10-15 08:25:39

标签: .net wpf dependency-properties

我已经阅读了Dependency属性几天,并了解它们如何检索值而不是像在CLR属性中那样设置/获取它们。如果我错了,请随意纠正我。

根据我的理解,从DependencyObject派生的所有WPF控件(如TextBlock,Button等)也将包含用于存储其值的依赖项属性,而不是使用CLR属性。这有利于在使用动画时覆盖本地值,或者在没有设置本地值的情况下继承值等。

我现在正试图想出一些样本来创建和使用我自己的dp。

1)是否可以在现有WPF控件上创建自己的依赖项属性?假设我想在WPF Textblock类上使用integer类型的依赖项属性?或者我是否必须创建一个派生自TextBlockBase的新类,以便在那里创建我的依赖属性?

2)在任何一种情况下,假设我在WPF文本块类上创建了一个依赖属性。现在我想通过将label的内容绑定到TextBlock的依赖属性来利用它。这样标签总是会显示TextBlock的dp的实际值,无论它是继承还是本地设置。

希望有人能帮我解决这两个例子...... 非常感谢, 卡瓦

3 个答案:

答案 0 :(得分:7)

您可以使用attached properties

定义你的属性MyInt:


namespace WpfApplication5
{
    public class MyProperties
    {
        public static readonly System.Windows.DependencyProperty MyIntProperty;

        static MyProperties()
        {
            MyIntProperty = System.Windows.DependencyProperty.RegisterAttached(
                "MyInt", typeof(int), typeof(MyProperties));
        }

        public static void SetMyInt(System.Windows.UIElement element, int value)
        {
            element.SetValue(MyIntProperty, value);
        }

        public static int GetMyInt(System.Windows.UIElement element)
        {
            return (int)element.GetValue(MyIntProperty);
        }
    }
}

绑定标签内容:


<Window x:Class="WpfApplication5.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication5"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Label Margin="98,115,51,119" Content="{Binding Path=(local:MyProperties.MyInt), RelativeSource={x:Static RelativeSource.Self}}" local:MyProperties.MyInt="42"/>
    </Grid>
</Window>

答案 1 :(得分:1)

您无法将DependencyProperties添加到现有类型。虽然你可以使用AttachedProperty,但使用它和推导新类型的逻辑完全不同。

在你的情况下,我建议推导出新类型。主要是因为您的逻辑与此类型绑定。这是继承的基础,不依赖于依赖属性。

在AttachedProperty的情况下,您只在另一个对象中给出另一个对象的值。像Grid.Row这样的东西给了它孩子的网格状态以及它应该如何定位它。设置此属性的对象不知道任何内容。

答案 2 :(得分:0)

以下是重置Run元素的示例:

using System;
using System.Windows;
using System.Windows.Documents;

namespace MyNameSpace.FlowDocumentBuilder
{
    public class ModifiedRun : Run
    {
        static DateRun()
        {
            TextProperty.OverrideMetadata(typeof(DateRun),new FrameworkPropertyMetadata(string.Empty,FrameworkPropertyMetadataOptions.Inherits,null,CoerceValue));
        }

        private static object CoerceValue(DependencyObject d, object basevalue)
        {
            return "AAAAAAAA";
        }
    }
}

相应的XAML是:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                      ColumnWidth="400"
                      FontSize="14"
                      FontFamily="Arial"
xmlns:local="clr-namespace:MyNameSpace.FlowDocumentBuilder;assembly=MyNameSpace.FlowDocumentBuilder"
>

<Paragraph><local:ModifiedRun Text="BBBBBBBBBB"/></Paragraph>

</FlowDocument>