1

実行時に生成したUIElementにビヘイビアー(Blend SDKのビヘイビアー)をアタッチしました。また、 Detach()Attach( )をトリガーする2つのボタンがありました。これは、基本的に動作を有効または無効にするためのものです。

問題は次のとおりです。動作をDetach()した後、Attach()は動作を依存関係オブジェクトに復元できませんでしたが、依存オブジェクトは動作なしのままでした。

// Declare the dependency object and behavior at class scope 
MyControl c = new MyControl();
MyBehavior b = new MyBehavior();

// Function that generate UI Controls with behavior attached
b.Attach(c);

// Function that detach behavior from dependency object
b.Detach();

// Function that re-attach behavior to the same object after it has been detached
b.Attach(c); // <-- Do not see the behavior...

動作が再接続されないのはなぜですか?また、動作をオンまたはオフに切り替えるための解決策または回避策はありますか?

4

1 に答える 1

1

問題はあなたの行動の論理に特有のようです。次のテストでは、動作は問題なく再接続されます。

public class ColorBehavior : Behavior<Border>
{
    public Brush OriginalBrush { get; set; }

    protected override void OnAttached()
    {
        base.OnAttached();

        this.OriginalBrush = this.AssociatedObject.Background;
        this.AssociatedObject.Background = Brushes.CadetBlue;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        this.AssociatedObject.Background = this.OriginalBrush;
    }
}

public partial class MainWindow : Window
{
    private ColorBehavior behavior = new ColorBehavior();
    private bool isAttached;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (!this.isAttached)
        {
            this.behavior.Attach(this.Border);
            this.isAttached = true;
        }
        else
        {
            this.behavior.Detach();
            this.isAttached = false;
        }
    }
}

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow"
    Width="525"
    Height="350">
<Grid>
    <Border x:Name="Border" Background="Red" />
    <Button Width="50"
            Height="20"
            Click="Button_Click"
            Content="Hey" />
</Grid>

于 2012-11-14T16:36:01.797 に答える