如何在Silverlight中为TextBox设置样式以实现行为?

4
在Xaml中,我可以为文本框放置自定义的行为,例如:
<TextBox>
   <i:Interaction.Behaviors>
       <My:TextBoxNewBehavior/>
   </i:Interaction.Behaviors>
</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 看起来在智能提示中没有出现。


你说“应用程序崩溃了”,那么异常信息和堆栈跟踪是什么? - nemesv
它说无法将类型MyNameSpace:TextBoxNewBehavior转换为类型....,但如果我直接将其放在xaml中,则没有问题。感到困惑。 - KentZhou
看起来并不那么容易...但我在这里找到了相同的问题,所以我投票关闭这个。 - nemesv
可能是重复的问题:如何在样式设置器中添加混合行为 - nemesv
这不是一个重复的内容 - 这是针对WPF的。 - SturmUndDrang
请查看以下链接:https://dev59.com/IHI-5IYBdhLWcg3w1sXi - Kreol
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>

这意味着在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*/ }
}

如果你要这样做,最好就在新的TBlock构造函数中完成整个过程...经过一段时间的尝试,在样式中设置行为似乎是最不繁琐的方式。 - Oyiwai

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>

如果我用其他方式写,它就不起作用,但是作为资源,集合可以工作!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接