2012-06-15 117 views
4

在XAML中,我可以把自定义的行为就像一个文本框:如何将行为置于Silverlight中的TextBox样式中?

<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看起来像智力不出来。

+0

你说“应用程序崩溃”什么是异常消息,stacktrace? – nemesv

+0

它表示无法强制类型MyNameSpace:TextBoxNewBehavior类型....但如果我直接将它放在xaml中,没有问题。困惑。 – KentZhou

+0

看起来并不那么容易......但我在这里发现了同样的问题,所以我正在投票结束这一个。 – nemesv

回答

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隐式集合语法,这就要求在行为集合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*/ } 
} 
+0

如果你要这个方式可能只是做新的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> 

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

相关问题