IsTabStop = False на текстовом поле SL4 - PullRequest
6 голосов
/ 26 апреля 2011

Я установил для IsTabStop значение false в текстовом поле, и я знаю, что это делает элемент управления неспособным получить фокус, но согласно форумам Silverlight , он все еще должен иметь возможность получать события мыши.У меня есть событие MouseLeftButtonUp и точка останова в моем методе tbxTotal_MouseLeftButtonUp, и он никогда не срабатывает во время отладки.Тема на SL Forums сейчас довольно старая, так что, возможно, это было изменено в каком-то обновлении.Мне нужно текстовое поле, в которое нельзя вставить вкладку, но которое все еще можно редактировать.Неужели это так сложно?

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Я не осознавал этого, но, похоже, это так. Кроме того, я не могу заставить MouseLeftButtonUp срабатывать. MouseLeftButtonDown работает, хотя и используя это, вы можете сделать это взломать.

<TextBox IsTabStop="False" MouseLeftButtonDown="TextBox_MouseLeftButtonDown" />

Тогда в коде вы можете обработать событие следующим образом.

    private void TextBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var textBox = ((TextBox) sender);
        textBox.IsTabStop = true;
        textBox.Focus();
        textBox.IsTabStop = false;
    }

Возможно, стоит обернуть его в CustomControl

public class FocusableTextBox : TextBox
{
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        if (!IsTabStop)
        {
            IsTabStop = true;
            Focus();
            IsTabStop = false;
        }

        base.OnMouseLeftButtonDown(e);
    }
}
1 голос
/ 03 января 2012

@ seekerOfKnowledge: Отключение IsTabStop на LostFocus - это хороший подход, но ваш хак перефокусировки не нужен. Это не дает никакого видимого эффекта в первый раз, потому что изменение IsTabStop еще не вступило в силу. Этот подход также можно использовать с любым другим элементом управления.

        var control = sender as Control;
        if (control != null)
        {
            control.MouseLeftButtonDown += (sender, args) =>
                {   //This event fires even if the control isn't allowed focus. 
                    //As long as the control is visible, it's typically hit-testable.
                    if (!control.IsTabStop)
                    {
                        control.IsTabStop = true;
                        //threading required so IsTabStop change can take effect before assigning focus
                        control.Dispatcher.BeginInvoke(() =>
                            {
                                control.Focus();
                            });
                    }
                };

            control.LostFocus += (sender, args) =>
                {   //Remove IsTabStop once the user exits the control
                    control.IsTabStop = false;
                };
        }
...