XAML: коснитесь текстового поля, чтобы включить?

В XAML и WinRT есть ли способ настроить текстовое поле, чтобы оно было отключено для ввода текста, пока оно не будет нажато.

Я попытался настроить событие Tapped, а затем установить IsEnabled=true, но, похоже, это работает, только если IsEnabled=true в первую очередь.

Я нашел это в MSDN: http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/708c0949-8b06-40ec-85fd-201139ca8b2d

Говорит о добавлении TappedEvent вручную к событию, обрабатываемому для каждого TextBox, что громоздко, но также, похоже, не работает, если для IsEnabled уже не установлено значение true.

По сути, мне нужна форма, в которой все текстовые поля отображают данные, но отключены, если только пользователь не нажмет, чтобы включить поле, а затем наберет текст.


person RallyRabbit    schedule 19.03.2013    source источник


Ответы (1)


Вы можете использовать IsReadOnly вместо IsEnabled для достижения того, что вы ищете. Кроме того, вы можете легко настроить обработчики событий Tapped в коде. Я не уверен, что для этого требуется настройка обработчиков в коде, как вы отметили выше; однако это упрощает дело.

Вот подробности.

В конструкторе вашего класса страницы (здесь это MainPage) вызовите функцию настройки:

public MainPage()
{
    this.InitializeComponent();
    // call the setup for the textboxes
    SetupTextBoxes();
}

Здесь мы творим магию — делаем все текстовые поля на этой странице доступными только для чтения и настраиваем обработчик нажатия:

private void SetupTextBoxes()
{
    var tbs = GetVisualChildren<TextBox>(this, true);
    foreach (var tb in tbs)
    {
        tb.IsReadOnly = true;
        tb.AddHandler(TappedEvent, new TappedEventHandler(tb_Tapped), true);
    }
}

Вспомогательная функция для получения списка всех дочерних элементов данного типа (T) переданного родителя.

private List<T> GetVisualChildren<T>(DependencyObject parent, bool recurse = true)
where T : DependencyObject
{
    var children = new List<T>();
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i);
        var child = v as T;
        if (child == null && recurse)
        {
            var myChildren = GetVisualChildren<T>(v, recurse);
            children.AddRange(myChildren);
        }
        if (child != null)
            children.Add(child);
    }
    return children;
}

Наконец, обработчик события. Это включает каждое текстовое поле при нажатии.

private void tb_Tapped(object sender, TappedRoutedEventArgs e)
{
    ((TextBox)(sender)).IsReadOnly = false;
}
person chue x    schedule 19.03.2013
comment
Типа работает. Спасибо. Я могу использовать поле только для чтения, а затем установить кисть темы для внешнего вида и поля по мере продвижения. Так что все в порядке, я думаю - person RallyRabbit; 20.03.2013
comment
@RallyRabbit - рад, что это работает для вас. Не забудьте принять ответ. - person chue x; 20.03.2013