Проблема Routed Events - попадание в корневой элемент пользовательского интерфейса перед дочерним элементом - PullRequest
1 голос
/ 22 сентября 2011

Мои перенаправленные события попадают в корневой элемент пользовательского интерфейса перед дочерним элементом.Это ожидается?Как сделать, чтобы перенаправленные события сначала попадали в дочерний элемент?

Цель: если текст набирается где-то, кроме «пользовательского текстового поля», поместите текст в «текстовое поле по умолчанию»

Результат: Window_PreviewTextInput isударил перед custom_PreviewTextInput, даже если мой курсор находится в фокусе «Custom Textbox»

Что мне делать по-другому?


XAML

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" SizeToContent="WidthAndHeight"
        PreviewTextInput="Window_PreviewTextInput"
        >
    <Grid Margin="100,100,100,100">
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="default" Width="100"/>
                <TextBox x:Name="defaultTB" Width="300" Height="50"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="custom" Width="100"/>
                <TextBox x:Name="custom" PreviewTextInput="custom_PreviewTextInput" Width="300" Height="50"/>
            </StackPanel>
        </StackPanel>
    </Grid>
</Window>

Код сзади:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        //goal:  if text is typed anywhere except custom textbox, put text in default textbox
        private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            Keyboard.Focus(defaultTB); 
        }

        //goal:  if text is typed in custom TB, put text there, and end the event routing
        private void custom_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            e.Handled = true; 
        }
    }
}

1 Ответ

2 голосов
/ 22 сентября 2011

Маршрутизируемое событие может быть пузырьковым или туннельным. У вас есть поведение события туннелирования.

Из MSDN, Событие UIElement.PreviewTextInput :

Стратегия маршрутизации - Туннелирование

Соответствующим событием пузырьков является TextInput.

Обзор маршрутизируемых событий - стратегии маршрутизации:

Bubbling : Вызываются обработчики событий в источнике событий. Разбитый событие затем направляется к последовательным родительским элементам до достижения корень дерева элементов. Большинство маршрутизируемых событий используют пузырчатую маршрутизацию стратегия. Пузырьковые перенаправленные события обычно используются для сообщения о входе или изменения состояния от отдельных элементов управления или других элементов пользовательского интерфейса

Direct : только самому исходному элементу предоставляется возможность вызывать обработчики в ответ. Это аналогично "маршрутизации" Windows Forms использует для событий. Однако, в отличие от стандартного события CLR, прямая маршрутизация событий поддерживает обработку классов (обработка классов объяснено в следующем разделе) и может использоваться EventSetter и EventTrigger.

Туннелирование : Первоначально обработчики событий в корне дерева элементов вызывается. Затем перенаправленное событие проходит маршрут через последовательный дочерние элементы вдоль маршрута, к элементу узла, который является источник перенаправленного события (элемент, вызвавший перенаправленное событие). Туннелирование перенаправленных событий часто используется или обрабатывается как часть составление для элемента управления, так что события из составных частей могут быть преднамеренно подавленными или замененными событиями, которые являются специфическими для полный контроль. Входные события, представленные в WPF, часто приходят реализован как пара туннелирования / пузыря. Туннельные события также иногда упоминается как Предварительный просмотр событий из-за именования соглашение, которое используется для пар.

...