我已经阅读了Dependency属性几天,并了解它们如何检索值而不是像在CLR属性中那样设置/获取它们。如果我错了,请随意纠正我。
根据我的理解,从DependencyObject派生的所有WPF控件(如TextBlock,Button等)也将包含用于存储其值的依赖项属性,而不是使用CLR属性。这有利于在使用动画时覆盖本地值,或者在没有设置本地值的情况下继承值等。
我现在正试图想出一些样本来创建和使用我自己的dp。
1)是否可以在现有WPF控件上创建自己的依赖项属性?假设我想在WPF Textblock类上使用integer类型的依赖项属性?或者我是否必须创建一个派生自TextBlockBase的新类,以便在那里创建我的依赖属性?
2)在任何一种情况下,假设我在WPF文本块类上创建了一个依赖属性。现在我想通过将label的内容绑定到TextBlock的依赖属性来利用它。这样标签总是会显示TextBlock的dp的实际值,无论它是继承还是本地设置。
希望有人能帮我解决这两个例子...... 非常感谢, 卡瓦
答案 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>