如何在Silverlight中为TextBox设置样式?

时间:2012-06-15 18:42:37

标签: silverlight silverlight-4.0 silverlight-5.0

在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似乎没有出现在情报中。

2 个答案:

答案 0 :(得分:4)

运行时错误说明

<Setter Property="i:Interaction.Behaviors">
    <Setter.Value>
        <My:TextBoxNewBehavior/>
    </Setter.Value>
</Setter>
  1. 您无法同时将行为附加到不同的对象。
  2. Interaction.Behaviors是一个您无法设置的只读集合。
  3. 书写

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

    表示在XAML中使用隐式集合语法,该语法在Behaviors集合上调用Add()。

    <强>解决方案

    使用样式设置器编写您自己附加的属性,如下所示:

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

答案 1 :(得分:0)

我已经在Windows 10项目中解决了它,但它应该兼容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>

如果我以任何其他方式书写它不起作用,但作为资源,该集合有效!