1

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

因此,我不仅想知道如何创建附加行为,还想查看它们用于解决问题的真实实例。我使用这篇 MSDN 文章以我认为有用的方式创建了一个带有附加属性的 UserControl,即一个堆栈面板,其中某些子元素要么突出显示,要么不突出显示。

这个例子运行良好,但是我在哪里放置逻辑来突出或不突出元素的突出显示(例如更改背景颜色) ?

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();
        }
    }
}
4

1 回答 1

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>

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

更新

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 )

于 2009-10-07T13:02:10.667 回答