How to put behavior in style for TextBox in Silverlight?

人盡茶涼 提交于 2020-01-02 05:34:06

问题


In Xaml, I can put customized behavior for a textbox like:

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

I want to all TextBox has this behavior, so how to put this behavior in implicit style like?

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

Update: Thanks for info. Try the way as suggested below and the app is crashed:

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

My behavior is something like:

 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 looks like not coming out in intelligence.


回答1:


Explanation of runtime error

<Setter Property="i:Interaction.Behaviors">
    <Setter.Value>
        <My:TextBoxNewBehavior/>
    </Setter.Value>
</Setter>
  1. You cannot attach a behavior to different objects at the same time.
  2. Interaction.Behaviors is a read-only collection that you cannot set.

Writing

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

means using the implicit collection syntax in XAML, which calls Add() on the Behaviors collection.

Solution

Write you own attached property that you set using the style setter like this:

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

Then you can create and set the behavior in the attached property code:

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*/ }
}



回答2:


I have solved it in a Windows 10 project but and it should be compatible for SL.

<Page.Resources>
    <i:BehaviorCollection x:Key="behaviors">
        <core:EventTriggerBehavior EventName="Tapped">
            <core:InvokeCommandAction Command="{Binding SetModeToAll}" />
        </core:EventTriggerBehavior>
    </i:BehaviorCollection>

    <Style TargetType="TextBlock" x:Key="textblockstyle">
        <Setter Property="i:Interaction.Behaviors" Value="{StaticResource behaviors}">
        </Setter>
    </Style>
</Page.Resources>

<Grid x:Name="LayoutRoot" Background="Transparent">
    <TextBlock Text="Testing" Foreground="Red" FontSize="20" Style="{StaticResource textblockstyle}">
    </TextBlock >
</Grid>

If I write in any other way it does not work, but as a resource the collection works!



来源:https://stackoverflow.com/questions/11056466/how-to-put-behavior-in-style-for-textbox-in-silverlight

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!