Должен ли я использовать CommandTarget? Я думал, что любой сфокусированный элемент получит Команду

Я пытаюсь понять, как использовать RoutedCommands. У меня сложилось впечатление, что если я не укажу CommandTarget на кнопке, любой сфокусированный элемент получит команду. Но по какой-то причине это не работает. Вот xaml, который не работает:

<Window x:Class="WpfTest11_Commands2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox Height="177" HorizontalAlignment="Left"
            Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="233" AcceptsReturn="True" />
        <TextBox Height="177" HorizontalAlignment="Left"
            Margin="258,12,0,0" Name="textBox2" VerticalAlignment="Top" Width="233" AcceptsReturn="True" />
        <Button Content="Cut"
                    Height="23" HorizontalAlignment="Left" Margin="12,195,0,0" Name="button1" VerticalAlignment="Top" Width="75"
                    Command="ApplicationCommands.Cut"/>
    </Grid>
</Window>

Если я добавлю CommandTarget к кнопке, она будет работать, но только для указанного текстового поля, конечно.

<Window x:Class="WpfTest11_Commands2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox Height="177" HorizontalAlignment="Left" Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="233" AcceptsReturn="True" />
        <TextBox Height="177" HorizontalAlignment="Left" Margin="258,12,0,0" Name="textBox2" VerticalAlignment="Top" Width="233" AcceptsReturn="True" />
        <Button Content="Cut"
                    Height="23" HorizontalAlignment="Left" Margin="12,195,0,0" Name="button1" VerticalAlignment="Top" Width="75"
                    Command="ApplicationCommands.Cut"
                    CommandTarget="{Binding ElementName=textBox1}"/>
    </Grid>
</Window>

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

Спасибо!

1 ответ

Решение

Вы должны установить FocusManager.IsFocusScope в True,

<Button Content="Cut"  FocusManager.IsFocusScope="True"         
        Margin="12,195,0,0" 
        Height="23" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="75"                     
        Command="ApplicationCommands.Cut"/>

Согласно http://msdn.microsoft.com/en-us/magazine/cc785480.aspx, причина этого заключается в следующем:

Если IsFocusScope="False", invoker команды ищет привязку команды между ее собственным местоположением в визуальном дереве и корнем визуального дерева.

Если IsFocusScope="True"вызывающая команда также просматривает путь визуального дерева от корня к элементу фокуса для привязки команды.

Другие вопросы по тегам