RoutedCommands выполнены и предварительно проведите события

StackOverflow https://stackoverflow.com/questions/4670703

  •  10-10-2019
  •  | 
  •  

Вопрос

Моя проблема в том, что я хотел бы справиться с командами в нескольких местах. Например, у меня есть мой пользовательский usercontrol, где кнопка связана с какой -то командой. У меня есть привязка команды в этом управлении, но у меня также есть привязка команды в окне, которое использует этот элемент управления.

Моя цель - выполнить какое -то действие внутри элемента управления, не прерывая обработку команды в окне.

Я попытался экспериментировать с выполненными и предварительными событиями, но не повезло. Затем я смоделировал проблему в одном окне (код размещен ниже).

<Window x:Class="CommandingEvents.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CommandingEvents="clr-namespace:CommandingEvents" 
    Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
    <CommandBinding 
        Command="{x:Static CommandingEvents:Window1.Connect}"
        Executed="CommandBindingWindow_Executed"
        PreviewExecuted="CommandBindingWindow_PreviewExecuted"/>
</Window.CommandBindings>
<Grid>
    <Grid.CommandBindings>
        <CommandBinding 
        Command="{x:Static CommandingEvents:Window1.Connect}"
        Executed="CommandBindingGrid_Executed"
        PreviewExecuted="CommandBindingGrid_PreviewExecuted" />
    </Grid.CommandBindings>
    <Button Command="{x:Static CommandingEvents:Window1.Connect}" 
            CommandTarget="{Binding RelativeSource={RelativeSource Self}}"
            Content="Test" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

namespace CommandingEvents
{
    public partial class Window1
    {
        public static readonly RoutedUICommand Connect = new
            RoutedUICommand("Connect", "Connect", typeof(Window1));

        public Window1()
        {
            InitializeComponent();
        }

        private void CommandBindingWindow_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingWindow_Executed");
            e.Handled = false;
        }

        private void CommandBindingGrid_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingGrid_Executed");
            e.Handled = false;
        }

        private void CommandBindingWindow_PreviewExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingWindow_PreviewExecuted");
            e.Handled = false;
        }

        private void CommandBindingGrid_PreviewExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            Console.WriteLine("CommandBindingGrid_PreviewExecuted");
            e.Handled = false;
        }
    }
}

Когда я нажимаю только кнопку "CommandBindingWindow_previewexecated". Почему это? Я попытался установить E.Handled False, но это не имеет значения. Кто -нибудь может объяснить это поведение?

Это было полезно?

Решение

Я понятия не имею, почему это происходит (и как это не ошибка), но вот что было написано в WPF Wiki:

Существует особенность командования, что чрезвычайно интересно и важно знать.

CommandManager использует маршрутируемые события, чтобы уведомить различные объекты команды, которые было вызвано выполнением команды (через жесты по умолчанию, входные привязки, явно и т. Д.).

До сих пор это довольно просто. Тем не менее, что более важно, так это то, что CommandBinding будет отмечать маршрутизированное событие от CommandManager как обработанное, как только будет выполнять обработчик (либо предварительный, или выполнен,).

Наконец, даже если у вашего обработчика есть прототип, который соответствует делегату под названием CERFEDRoutedEventhandler, выполненное событие из командного связывания - это не RoutedEvent, а обычное событие CLR. Установка или оставление флага E.Handled в False ничего не изменит.

Следовательно, как только будет вызоваться выполненным или предварительным обработчиком, RoutedCommand остановит свою маршрутизацию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top