4

Xamlでは、次のようなテキストボックスのカスタマイズされた動作を配置できます。

<TextBox>
   <i:Interaction.Behaviors>
       <My:TextBoxNewBehavior/>
   </i:Interaction.Behaviors>
</TextBox>

すべてのTextBoxにこの動作を持たせたいので、この動作を暗黙のスタイルにするにはどうすればよいですか?

<Style TargetType="TextBox">
    <Setter Property="BorderThickness" Value="1"/>
    ....
</Style> 

更新:情報をありがとう。以下に提案されている方法を試してみてください。アプリがクラッシュします。

<Setter Property="i:Interaction.Behaviors">
    <Setter.Value>
        <My:TextBoxNewBehavior/>
    </Setter.Value>
</Setter>

私の行動は次のようなものです。

 public class TextBoxMyBehavior : Behavior<TextBox>
    {
        public TextBoxMyBehavior()
        {
        }

        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.KeyUp += new System.Windows.Input.KeyEventHandler(AssociatedObject_KeyUp);
        }

        void AssociatedObject_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                //....
            }
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
            AssociatedObject.KeyUp -= new System.Windows.Input.KeyEventHandler(AssociatedObject_KeyUp);
        }
    }

TextBoxMyBehaviorは、インテリジェンスで出てこないように見えます。

4

2 に答える 2

4

実行時エラーの説明

<Setter Property="i:Interaction.Behaviors">
    <Setter.Value>
        <My:TextBoxNewBehavior/>
    </Setter.Value>
</Setter>
  1. 動作を異なるオブジェクトに同時にアタッチすることはできません。
  2. Interaction.Behaviors は、設定できない読み取り専用のコレクションです。

書き込み

<i:Interaction.Behaviors>
     <My:TextBoxNewBehavior/>
</i:Interaction.Behaviors>

Behaviors コレクションで Add() を呼び出す XAML の暗黙的なコレクション構文を使用することを意味します。

解決

次のように、スタイル セッターを使用して設定する独自の添付プロパティを記述します。

<Setter Property="my:TextBoxOptions.UseMyBehavior" Value="true" />

次に、添付されたプロパティ コードで動作を作成および設定できます。

private static void OnUseMyBehaviorPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
    if (e.NewValue.Equals(true))
        Interaction.GetBehaviors(dependencyObject).Add(new TextBoxNewBehavior());
    else { /*remove from behaviors if needed*/ }
}
于 2013-01-04T10:22:13.160 に答える