Silverlight中是否存在ProcessTabKey等效项(专注于层次结构中的下一个控件)

时间:2010-12-16 19:41:26

标签: silverlight-4.0 focus

在Silverlight中是否有与WinForm的ProcessTabKey等效的方法,或者正确模拟它的方法?

环顾我所看到的是人们对每一个控件进行硬编码(text1有一个KeyDown事件来聚焦text2,text2有一个KeyDown事件来聚焦text3等)。一些已经发展到基于TabIndex查询部分布局层次结构,但默认情况下所有控件都具有相同的TabIndex,因此它再次成为手动设置任务。

最后的皱纹是处理嵌套容器。例如,垂直方向的文本框堆栈面板,后面是水平方向的按钮堆栈面板。我见过的大多数程序化方法都试图假设所有控件都是同一父容器的直接子节点。

据我所知,Silverlight必须在一些限制下运行,以防止Silverlight应用程序将焦点重新设置回浏览器的一部分(潜在的安全风险),但我希望有一些方法可以创建一个正确的Enter-to-Tab没有手工制作所有形式的设置。

1 个答案:

答案 0 :(得分:0)

StackOverflow中存在一个相关问题:Auto-tab in Silverlight 3

我正在使用自定义附加行为(System.Windows.Interactivity)以避免代码落后,因为我和MVVM一起运行良好。

<UserControl x:Class="SCO.Ria.UI.Views.LoginView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:local="clr-namespace:Caliburn.Micro.Focus;assembly=Caliburn.Micro.Focus" mc:Ignorable="d"
d:DesignHeight="154" d:DesignWidth="468">

    <interactivity:Interaction.Behaviors>
        <local:TabNextBehavior/>
    </interactivity:Interaction.Behaviors>

</UserControl>

TabNextBehavior.cs:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interactivity;

namespace Caliburn.Micro.Focus {

public class TabNextBehavior : Behavior<Control> {

    protected override void OnAttached() {
        base.OnAttached();

        this.AssociatedObject.KeyUp += AssociatedObject_KeyUp;
    }

    protected override void OnDetaching() {
        base.OnDetaching();

        this.AssociatedObject.KeyUp -= AssociatedObject_KeyUp;
    }

    void AssociatedObject_KeyUp(object sender, KeyEventArgs args) {

        if (args.Key == System.Windows.Input.Key.Enter) {

            DependencyObject parent = null;
            if (AssociatedObject is ChildWindow)
                parent = ((ChildWindow)parent).Content as DependencyObject;
            else parent = AssociatedObject;

            parent.TabNext(); //extensin Method from VisualTreeExtensions.cs
        }
    }
}

您可以在此处查看要点:https://gist.github.com/4576803