Почему мой пользовательский RoutedCommand не запутывает всех визуальных родителей?
Придуманный пример: Window -Grid --StackPanel ---Slider ---Slider
Оба ползунка используют Interaction.Triggers для отправки пользовательской команды, определенной в codebehind. Каждый из визуальных родителей определяет CommandBinding, чтобы связать эту команду Test и вызвать обработчик Executed в коде позади. Только обработчик для самого близкого предка поражен: например, если все три привязки находятся в xaml, тогда поражена только точка останова StackPanel_CommandBinding_Executed. Если я закомментирую CommandBinding для StackPanel, то будет обработан следующий родительский более высокий обработчик (StackPanel_CommandBinding_Executed).
Хотя в этом примере используется взаимодействие, я попробовал то же самое с более простой командой Button. Тот же результат.
Я предполагаю, что у меня были неправильные ожидания здесь. Я думал, что эта всплывающая команда будет проверять обработчики из фокусирующего ползунка вверх по дереву визуалов. На каждом уровне вверх, если для команды был привязан обработчик Executed, он вызывался. Я ожидал, что каждый из обработчиков будет вызван по очереди: StackPanel, Grid, Window. Я читал, что Bubbling не остановился только потому, что на данном уровне был найден обработчик, но это не мой опыт.
// in RoutedCommandStackru ns
public class CustomCommands
{
public static readonly RoutedUICommand Test
= new RoutedUICommand("Test","Test",typeof(CustomCommands));
}
//the Executed handlers are like:
private void StackPanel_CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
Debug.Assert(e.Handled == false);
Debug.WriteLine("StackPanel_CommandBinding_Executed");
}
<Window x:Class="RoutedCommandStackru.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:iAct="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:RoutedCommandStackru"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.CommandBindings>
<CommandBinding Command="{x:Static local:CustomCommands.Test}" Executed="Window_CommandBinding_Executed"/>
</Window.CommandBindings>
<Grid>
<Grid.CommandBindings>
<CommandBinding Command="{x:Static local:CustomCommands.Test}" Executed="Grid_CommandBinding_Executed"/>
</Grid.CommandBindings>
<StackPanel>
<StackPanel.CommandBindings>
<CommandBinding Command="{x:Static local:CustomCommands.Test}" Executed="StackPanel_CommandBinding_Executed"/>
</StackPanel.CommandBindings>
<Slider Name="gridSlider1" Margin="10">
<iAct:Interaction.Triggers>
<iAct:EventTrigger EventName="GotFocus">
<iAct:InvokeCommandAction Command="{x:Static local:CustomCommands.Test}"/>
</iAct:EventTrigger>
</iAct:Interaction.Triggers>
</Slider>
<Slider Name="gridSlider2" Margin="10">
<iAct:Interaction.Triggers>
<iAct:EventTrigger EventName="GotFocus">
<iAct:InvokeCommandAction Command="{x:Static local:CustomCommands.Test}"/>
</iAct:EventTrigger>
</iAct:Interaction.Triggers>
</Slider>
</StackPanel>
</Grid>