Как управлять порядком табуляции, не отключая весь фокус для элементов управления в этом сценарии

У меня есть элемент управления, который выглядит так, у него есть несколько текстовых полей.

[1 ][2 ][3 ][4 ]

Теперь в моем приложении эти элементы управления формируют своего рода матрицу, например

[1 ][2 ][3 ][4 ]
[1 ][2 ][3 ][4 ]
[1 ][2 ][3 ][4 ]

Теперь я хотел установить 1 3 и 4 IsTabStop = false, чтобы пользователь мог вводить только вторые текстовые поля. После того, как я это сделал, я обнаружил, что 1 3 4 теперь не может быть сфокусирован. И, к моему удивлению, в WPF это не так, так что это просто еще одно неожиданное ограничение Silverlight!

http://msdn.microsoft.com/ru-ru/library/system.windows.controls.control.istabstop(v=vs.95).aspx

Как продолжить мою первоначальную вкладку через план [2 ]?


person Valentin Kuzub    schedule 21.09.2011    source источник


Ответы (1)


Я считаю, что вы можете расширить элемент управления TextBox, чтобы он был сфокусирован. См. этот пост.

Прикрепленное свойство

public class Ex
{
    public static bool GetIsTabStop(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsTabStopProperty);
    }

    public static void SetIsTabStop(DependencyObject obj, bool value)
    {
        obj.SetValue(IsTabStopProperty, value);
    }

    // Using a DependencyProperty as the backing store for IsTabStop.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsTabStopProperty =
        DependencyProperty.RegisterAttached("IsTabStop", typeof(bool), typeof(Ex), new PropertyMetadata(true, Callback));

    private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as Control;
        if (control != null)
        {
            control.IsTabStop = (bool)e.NewValue;

            control.MouseLeftButtonDown += (sender, args) =>
            {
                if (!control.IsTabStop)
                {
                    control.IsTabStop = true;
                    control.Focus();
                    control.IsTabStop = false;
                } 
            };
        }
    }
}

XAML

    <TextBox HorizontalAlignment="Left" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Margin="215,49,0,0" RenderTransformOrigin="0,7.25"/>
    <TextBox HorizontalAlignment="Left" local:Ex.IsTabStop="False" TextWrapping="Wrap" Text="TextBox" Margin="215,96,0,0" VerticalAlignment="Top"/>
    <RadioButton Content="RadioButton" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="210,144,0,0"/>
    <RadioButton Content="RadioButton" local:Ex.IsTabStop="False" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="213,183,0,0"/>

Вы можете в основном прикрепить это ко всему, что унаследовано от Control.

person Justin XL    schedule 22.09.2011
comment
гах, это так по-хакерски. У меня тоже есть радиокнопки, больше взломов, в том числе .. спасибо за ссылку на это +1 - person Valentin Kuzub; 22.09.2011
comment
в этом случае свойства присоединения - ваш друг. Пожалуйста, посмотрите мой обновленный ответ. - person Justin XL; 22.09.2011
comment
спасибо, это намного лучше, и я думаю, что это один из лучших способов решить эту проблему. - person Valentin Kuzub; 23.09.2011