如何在Silverlight中设置焦点

如何在Silverlight中设置焦点

问题描述:

我有一个带有多个文本框的用户控件的Silverlight应用程序。我正在使用MVVM模式。如何在Silverlight中设置焦点

当我点击添加按钮时,ViewModel执行一些逻辑。在添加命令逻辑完成后,我想在每次单击后将SetFocus设置为txtName文本框。

我该怎么用Silverlight UserControl和MVVM做到这一点?

当然没有“IsFocused”属性,但也有至少两个MVVM友好的方式,你可以使用:

  1. 使用触发器/动作组在混合SDK扩展。具体来说,在按钮的“单击”事件上使用EventTrigger,然后使用CallMethodAction在目标元素上调用“SetFocus”。
  2. 使用Behavior以及附加属性在目标上调用“焦点”。

对于第一个,你只需要像这样:

<Button Content="Add" 
     xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
     xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
      <i:InvokeCommandAction Command="{Binding AddCommand}" /> 
      <ei:CallMethodAction TargetObject="{Binding ElementName=NameOfElementToFocus}" 
           MethodName="Focus" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 

<TextBox x:Name="NameOfElementToFocus" /> 

(或者,而不是使用CallMethodAction,你也可以使用一个简单的"focus"动作。)


我不会发布第二种方法的任何代码 - 这是一个常见的用例,您将能够找到ex通过搜索找到(for example)。基本思想是创建一个Behavior类,并在其“change”处理程序中添加布尔附加属性“IsFocused”,然后在AttachedObject上调用“Focus”。然后您可以将属性MVVM式绑定到一个属性在您的视图模型,这样的事情:

<TextBox x:Name="NameOfElementToFocus" my:FocusBehavior.IsFocused="{Binding IsTextBoxFocused}" /> 
+0

哦McGarnagle,有一天,我一定给你买啤酒先生,我从来没有想过,简单callmethodaction路线,干杯。 – 2014-10-21 19:33:53