Я создал Attached Property, теперь, как мне его использовать? - PullRequest
1 голос
/ 07 октября 2009

Я пытаюсь определить, является ли присоединенное поведение чем-то, что нам нужно в построении элементов управления для форм в нашем приложении.

Следовательно, я не только хочу знать, как создавать Присоединенные поведения, но и видеть реальные случаи, когда они используются для решения проблем. Я использовал эту статью 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();
        }
    }
}

1 Ответ

1 голос
/ 07 октября 2009

Вот очень простой пример: прикрепленное поведение, которое показывает сообщение, когда пользователь нажимает кнопку. Сообщение может быть настроено через свойство зависимости в самом поведении.

Код поведения:

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>

Здесь указывается, что вы должны переопределить методы OnAttached и OnDetached. Здесь вы присоединяете / отсоединяете обработчики к любым событиям, которые хотите контролировать в связанном элементе, и делаете все, что хотите в обработчиках. Это очень мощный и гибкий способ добавления интерактивности к визуальным элементам управления.

Обновление

Базовый класс 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...