Silverlight - 设置MVVM中UI元素的tabindex

时间:2011-05-10 20:19:23

标签: silverlight mvvm tabindex uielement

我正在尝试在用户控件中设置两个UIElement的标签索引。用户控件包含一个文本框和按钮。我目前通过附加属性将焦点应用于文本框但是我希望能够按Tab键并从文本块导航到按钮或检测按键(Enter键)并触发按钮上的命令(我知道单独的问题)

主要关注的是首先完成选项卡索引。

感谢您的任何指示或建议。

更新

我已经尝试使用附加属性来处理Tab键顺序

        public static DependencyProperty TabIndexProperty = DependencyProperty.RegisterAttached("TabIndex", typeof(int), typeof(AttachedProperties), null);
    public static void SetTabIndex(UIElement element, int value)
    {
        Control c = element as Control;
        if (c != null)
        {

            RoutedEventHandler loadedEventHandler = null;
            loadedEventHandler = new RoutedEventHandler(delegate
                {
                    HtmlPage.Plugin.Focus();
                    c.Loaded -= loadedEventHandler;
                    c.Focus();
                });
            c.Loaded += loadedEventHandler;
        }
    } 

然而,当我尝试编译时,我收到的错误是按钮控件不存在TabIndex属性。任何想法为什么会失败?

2 个答案:

答案 0 :(得分:2)

这是一个特定于视图的视图,因此,即使在MVVM中也应该在ViewLevel中处理。 MVVM没有规定您从后面的代码中删除所有代码。它只是意味着当你将代码放在那里时,你应该有一个特定于视图的视图。这是其中一个案例,imo。

答案 1 :(得分:0)

当天晚些时候......我用附属物解决了这个问题。在上面的解决方案中,我复制了我创建的早期DP,并且在我测试之前没有更改代码。

以下是工作解决方案

我创建了一个附加的属性类,然后添加了以下代码:

       #region Search Field Focus

    public static DependencyProperty InitialFocusProperty = DependencyProperty.RegisterAttached("InitialFocus", typeof(bool), typeof(AttachedProperties), null);

    public static void SetInitialFocus(UIElement element, bool value)
    {
        Control c = element as Control;
        if (c != null && value)
        {
            RoutedEventHandler loadedEventHandler = null;
            //set focus on control
            loadedEventHandler = new RoutedEventHandler(delegate
                {
                HtmlPage.Plugin.Focus();
                c.Loaded -= loadedEventHandler;
                c.Focus();
            });
            c.Loaded += loadedEventHandler;
        }
    }

    public static bool GetInitialFocus(UIElement element)
    {
        return false;
    }
    #endregion

    #region Tabbing Order of Elements

    public static DependencyProperty TabIndexProperty = DependencyProperty.RegisterAttached("TabIndex", typeof(int), typeof(AttachedProperties), null);
    public static void SetTabIndex(UIElement element, int value)
    {
        element.SetValue(TabIndexProperty, value);
    }

    public static int GetTabIndex(UIElement element)
    {
        return (int)element.GetValue(TabIndexProperty);
    }
    #endregion

第一个DP设置文本块的焦点,以便在加载用户控件时,您可以看到光标位于文本字段中。

DP 2设置标签顺序。由于焦点已经应用于当前控制标签正常落入到位。如果您没有专注于控件,则需要先设置它。

然后最终在xaml中声明你的类在xmlns中并添加到控件。