2009-10-07 3 views
1

Я пытаюсь определить, нужны ли приложенные поведении в средства управления зданием для форм в нашем приложении.Я создал прикрепленное свойство, теперь как его использовать?

Таким образом, я не только хочу знать, как создать Attached Поведения, но хотят видеть реальные случаи, в которых они используются для решения проблем. Я использовал this MSDN article, чтобы создать 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

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

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

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 методы. Здесь вы прикрепляете/отсоединяете обработчики к тем событиям, которые хотите контролировать в связанном элементе, и делаете все, что хотите в обработчиках. Это очень мощный и гибкий способ добавления интерактивности в визуальные элементы управления.

Update

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

+0

Что мне нужно для ссылки на использование класса «Поведение», я нахожу только System.ComponentModel.CategoryAttribute.Behavior (http://msdn.microsoft.com/en-us/library/system. componentmodel.categoryattribute.behavior.aspx) в System.dll, на который я ссылаюсь, говорит, что тип «Поведение» не найден. –

+0

Вам необходимо обратиться к сборке System.Windows.Interactivity. Он установлен как часть Expression Blend 3. – Konamiman

+0

Это хорошо работает в WPF, и я технически понимаю, как это работает. Я думаю, что мы могли бы использовать это в наших формах, возможно, вместо сообщения определить ItemType (Customer или Employee) и, следовательно, иметь разные проверки, сообщения и т. Д. Как вы используете его в реальных приложениях? –

Смежные вопросы