我创建了一个附属物,现在我该如何使用它?

时间:2009-10-07 12:55:09

标签: c# wpf xaml dependency-properties attached-properties

我正在尝试确定附加行为是否是我们应用程序中表单的构建控件所需的内容。

因此,我不仅想知道如何创建附加行为,还希望看到使用的真实实例来解决问题。我使用this MSDN article创建了一个带有附加属性的UserControl,我认为这种方式很有用,即一个stackpanel,其中某些子元素突出显示或不突出显示。

此示例运行良好,但我在哪里将逻辑设置为突出显示或不突出显示(例如更改背景颜色)元素?

XAML:

<Window x:Class="TestAttachedProperties2343.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestAttachedProperties2343"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <local:ExtendedStackPanel>
            <TextBlock local:ExtendedStackPanel.IsHighlighted="True" Text="text1"/>
            <TextBox local:ExtendedStackPanel.IsHighlighted="False" Text="text2"/>
            <TextBox local:ExtendedStackPanel.IsHighlighted="True" Text="text3"/>
        </local:ExtendedStackPanel>
    </Grid>
</Window>

代码背后:

using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
using System;

namespace TestAttachedProperties2343
{
    public partial class ExtendedStackPanel : StackPanel
    {
        public static readonly DependencyProperty IsHighlightedProperty = DependencyProperty.RegisterAttached(
            "IsHighlighted",
            typeof(Boolean),
            typeof(ExtendedStackPanel),
            new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));

        public static void SetIsHighlighted(UIElement element, Boolean value)
        {
            element.SetValue(IsHighlightedProperty, value);
        }
        public static Boolean GetIsHighlighted(UIElement element)
        {
            return (Boolean)element.GetValue(IsHighlightedProperty);
        }

        public ExtendedStackPanel()
        {
            InitializeComponent();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这是一个非常简单的例子:附加行为,当用户点击按钮时会显示一条消息。消息可以通过行为本身的依赖属性进行自定义。

行为代码:

public class MyBehavior : Behavior<Button>
{
    public static readonly DependencyProperty MessageProperty =
        DependencyProperty.Register("Message",
        typeof(string), typeof(MyBehavior),
        new PropertyMetadata("Default message"));

    public MyBehavior()
        : base()
    { }

    public string Message
    {
        get { return (string)GetValue(MessageProperty); }
        set { SetValue(MessageProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Click += new RoutedEventHandler(AssociatedObject_Click);
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.Click -= new RoutedEventHandler(AssociatedObject_Click);
    }

    void AssociatedObject_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(Message);
    }
}

使用此行为的XAML:

<Button x:Name="MyButton" Content="Click me for custom behavior">
    <i:Interaction.Behaviors>
        <local:MyBehavior Message="Hello from custom behavior"/>
    </i:Interaction.Behaviors>
</Button>

这里的关键是您必须覆盖OnAttachedOnDetached方法。在这里,您可以将处理程序附加/分离到要在关联元素中控制的任何事件,并在处理程序中执行任何操作。它是一种非常强大且灵活的方式,可以为视觉控件添加交互性。

<强>更新

基础Behavior<>类位于System.Windows.Interactivity.dll程序集中,该程序集不是Silverligh运行时的一部分,但随Microsoft Expression Blend 3一起安装。无论如何,此程序集可以自由重新分发(请参阅这里:http://social.expression.microsoft.com/Forums/en-US/blend/thread/8523aec4-1a10-4864-8ad4-f95a3627bb4a