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>

意味着使用 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*/ }
}
于 2013-01-04T10:22:13.160 回答
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>

如果我以任何其他方式写作,它就不起作用,但作为一种资源,这个集合是有效的!

于 2015-04-13T14:53:05.780 回答