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>

ここで重要なのは、 メソッドOnAttachedOnDetachedメソッドをオーバーライドする必要があるということです。ここでは、関連付けられた要素で制御したいイベントにハンドラーをアタッチ/デタッチし、ハンドラーで必要なことを行います。これは、ビジュアル コントロールにインタラクティブ性を追加するための非常に強力で柔軟な方法です。

アップデート

基本Behavior<>クラスはSystem.Windows.Interactivity.dll、Silverligh ランタイムの一部ではありませんが、Microsoft Expression Blend 3 と共にインストールされるアセンブリ内にあります。とにかく、このアセンブリは自由に再配布できるようです (こちらを参照してください: http://social.expression.microsoft.com /フォーラム/en-US/blend/thread/8523aec4-1a10-4864-8ad4-f95a3627bb4a )

于 2009-10-07T13:02:10.667 に答える