Есть ли в Silverlight эквивалент ProcessTabKey (фокус на следующем элементе управления в иерархии) - PullRequest
2 голосов
/ 16 декабря 2010

Существует ли эквивалентный метод ProcessTabKey в WinForm в Silverlight или способ правильно его смоделировать?

Посмотрите, что я вижу, люди жестко программируют каждый элемент управления (text1 имеет событие KeyDown для фокусировки на text2text2 имеет событие KeyDown для фокусировки текста3 и т. д.).Некоторые из них перешли к выполнению запросов к части иерархии макетов на основе TabIndex, но по умолчанию все элементы управления имеют одинаковый TabIndex, так что это снова задача ручной настройки.

Последняя морщина связана с вложенными контейнерами.Например, вертикально ориентированная панель стека текстовых полей, за которой следует горизонтально ориентированная панель стека кнопок.Большинство программных подходов, которые я видел, пытаются предположить, что все элементы управления являются прямыми потомками одного и того же родительского контейнера.

Я понимаю, что Silverlight должен работать с некоторыми ограничениями, чтобы приложение Silverlight не могло перенести фокус обратно на частьбраузер (потенциальная угроза безопасности), но я надеюсь, что есть какой-то способ создать правильную настройку Enter-to-Tab без ручной обработки всех форм.

1 Ответ

0 голосов
/ 20 января 2013

В StackOverflow есть связанный вопрос: Автоматическая вкладка в Silverlight 3

Я использую пользовательское поведение (System.Windows.Interactivity), чтобы избежать кода, потому что Iand хорошо работает с 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

...