我有一个网格和一个按钮。我希望能够按向下箭头选择一行,然后单击按钮,然后按向下箭头选择下一行,然后单击按钮。
但是,当我点击按钮时,网格键盘焦点不再在该行上。
这是一个例子。在这张图片中,我选择了第三行。我想要的行为是:我鼠标点击按我,然后按键盘向下箭头一次选择第四行。相反,当我按向下箭头时,顶部单元格周围有一个框架,当我再次按下它时,顶行被选中。
我应该如何创建我需要的行为?我已经尝试编辑后面的代码以明确地关注网格,但这不起作用。
以下是该示例的完整代码。
<Window x:Class="WpfTest.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">
<Window.Resources>
<XmlDataProvider x:Key="DcCharacters">
<x:XData>
<Characters xmlns="">
<Character HeroName="Catwoman" Identity="Selina Kyle" />
<Character HeroName="Batman" Identity="Bruce Wayne" />
<Character HeroName="Starman" Identity="Jack Knight" />
<Character HeroName="BlueBeetle" Identity="Jaime Reyes" />
</Characters>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<DataGrid
Grid.Row="0"
ItemsSource="{Binding Source={StaticResource DcCharacters},
XPath=//Characters/Character}"
AutoGenerateColumns="False"
IsReadOnly="True"
>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding XPath=@HeroName}" />
<DataGridTextColumn Binding="{Binding XPath=@Identity}" />
</DataGrid.Columns>
</DataGrid>
<StackPanel Grid.Row="1">
<Button Margin="3,3,3,3" Width="Auto" Height="Auto" HorizontalAlignment="Left">_Press Me!</Button>
</StackPanel>
</Grid>
</Window>
答案 0 :(得分:2)
我认为您正在寻找附属财产FocusManager.IsFocusScope。
通过在StackPanel
上将其设置为true,如果用鼠标单击它们,其中的Button's
(或其他控件)将不会窃取焦点。它们将像工具栏按钮或菜单一样工作。你仍然可以向他们添加标签。
以下是一个示例,如果您有三个按钮而不是一个,剪切,复制和粘贴
<StackPanel Grid.Row="1"
FocusManager.IsFocusScope="True" >
<Button Width="Auto" Height="Auto" HorizontalAlignment="Left">Cut</Button>
<Button Width="Auto" Height="Auto" HorizontalAlignment="Left">Copy</Button>
<Button Width="Auto" Height="Auto" HorizontalAlignment="Left">Paste</Button>
</StackPanel>
或者在你的情况下,只是
<StackPanel Grid.Row="1"
FocusManager.IsFocusScope="True">
<Button Margin="3,3,3,3" Width="Auto" Height="Auto" HorizontalAlignment="Left">_Press Me!</Button>
</StackPanel>
答案 1 :(得分:1)
只需Focusable = "False"
即可获得按钮。它对我有用。
<Button Margin="3,3,3,3" Width="Auto" Height="Auto" HorizontalAlignment="Left" Focusable="False">_Press Me!</Button>
答案 2 :(得分:1)
有点黑客但它有效
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (myDataGrid.SelectedItem != null && e.Key == Key.Down)
{
DataGridRow dgrow = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.SelectedItem);
dgrow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}