当前位置: 首页 > 编程笔记 >

wpf 附加的依赖项属性

饶德元
2023-03-14
本文向大家介绍wpf 附加的依赖项属性,包括了wpf 附加的依赖项属性的使用技巧和注意事项,需要的朋友参考一下

示例

何时使用

附加属性是一种依赖项属性,可以将其应用于任何属性,DependencyObject以增强了解该属性存在的各种控件或服务的行为。

附加属性的一些用例包括:

  1. 有一个父元素遍历其子元素并以某种方式作用于子元素。例如,Grid控制使用Grid.Row,Grid.Column,Grid.RowSpan,和Grid.ColumnSpan附加属性来安排元件为行和列。

  2. 使用自定义模板向现有控件添加视觉效果,在e.g整个应用范围内的空文本框中添加水印,而无需子类化TextBox。

  3. 为某些或所有现有控件(例如ToolTipService或)提供通用服务或功能FocusManager。这些通常称为附加行为

  4. 当需要向下继承时,例如,类似于的行为DataContext。

这进一步说明了Grid用例中正在发生的事情:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Label Grid.Column="0" Content="你的名字:" />
    <TextBox Grid.Column="1" Text="{Binding FirstName}" />
</Grid>

Grid.Column不是Label或都不存在的属性TextBox。而是,Grid控件通过其子元素进行查找,并根据附加属性的值对其进行排列。

如何定义

我们将继续使用Grid此示例。的定义Grid.Column如下所示,但DependencyPropertyChangedEventHandler为简洁起见,将其排除在外。

public static readonly DependencyProperty RowProperty =
    DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid),
        new FrameworkPropertyMetadata(0, ...));

public static void SetRow(UIElement element, int value)
{
    if (element == null)
        throw new ArgumentNullException("element");

    element.SetValue(RowProperty, value);
}

public static int GetRow(UIElement element)
{
    if (element == null)
        throw new ArgumentNullException("element");

    return ((int)element.GetValue(RowProperty));
}

由于附加属性可以附加到各种项目,因此不能将其实现为CLR属性。相反,引入了一对静态方法。

因此,与标准依赖项属性相反,附加属性也可以在不是从派生的类中定义DependencyObject。

适用于常规依赖项属性的命名约定也适用于此:依赖项属性RowProperty具有对应的方法GetRow和SetRow。

注意事项

如MSDN上所述:

尽管属性值继承似乎适用于非附加的依赖项属性,但未定义通过运行时树中某些元素边界的非附加属性的继承行为。始终使用RegisterAttached在元数据中指定继承的位置注册属性。

 类似资料:
  • 我很难理解WPF中的依赖属性,可能是因为我要找的用例非常具体,没有很好的文档化。 我有一个自定义控件,看起来像这样(请忽略所有可怕的代码,这是暂时的!): 我这样称呼它在我的主窗口内: 我只想在主窗口中的自定义控件调用中说: (其中fillPercent是另一个脚本中不需要担心的内容)。该控件将被展开,因此需要保持为自定义控件。我明白我可能需要依赖属性,但在尝试了许多不同的方法后,我无法弄清楚如何

  • 本文向大家介绍wpf 只读依赖项属性,包括了wpf 只读依赖项属性的使用技巧和注意事项,需要的朋友参考一下 示例 何时使用 只读的依赖项属性与普通的依赖项属性相似,但其结构不允许从控件外部设置其值。如果您拥有仅供消费者参考的属性,则此方法很好用,例如IsMouseOver或IsKeyboardFocusWithin。 如何定义 与标准依赖项属性一样,只读依赖项属性必须在从派生的类上定义Depend

  • 本文向大家介绍wpf 标准依赖项属性,包括了wpf 标准依赖项属性的使用技巧和注意事项,需要的朋友参考一下 示例 何时使用 几乎所有的WPF控件都大量使用依赖属性。依赖项属性允许使用许多仅标准CLR属性无法使用的WPF功能,包括但不限于对样式、动画、数据绑定、值继承和更改通知的支持。 TextBox.Text属性是需要标准依赖项属性的简单示例。在这里,如果Text是标准的CLR属性,则无法进行数据

  • 我有一个Advision类,它使用了代理jar中的另一个类,但这个类依赖于代理jar中不存在的一个类。代理jar中不存在的这个类存在于应用程序类加载器上的另一个jar中。代理jar位于系统类加载器上。所以我没有遇到ClassDefounderRor。我已经尝试使用Transformer.forAdvise,这是在另一篇文章中建议的,但这只适用于Advise类。

  • 如何将此WorldEdit依赖项添加到Maven项目中?http://maven.sk89q.com/artifactory/repo/com/sk89q/worldedit/worldedit-bukkit/我需要6.1.1快照。 是否有算法来获取组ID工件ID和版本?