Нужно ли использовать CommandTarget? Я думал, что любой сфокусированный элемент получит команду
Я пытаюсь понять, как использовать RoutedCommands. У меня создалось впечатление, что если я не укажу CommandTarget на Button, любой сфокусированный элемент получит команду.
Но по какой-то причине это не сработает. Вот 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 к Button, он будет работать, но только для текстового поля, которое указано, конечно.
<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"
, команда invoker также просматривает путь визуального дерева от корня до элемента focus для привязки команды.