即使左键单击按钮,也可以保留网格焦点状态

时间:2011-07-14 05:39:42

标签: wpf datagrid wpfdatagrid

我有一个网格和一个按钮。我希望能够按向下箭头选择一行,然后单击按钮,然后按向下箭头选择下一行,然后单击按钮。

但是,当我点击按钮时,网格键盘焦点不再在该行上。

这是一个例子。在这张图片中,我选择了第三行。我想要的行为是:我鼠标点击按我,然后按键盘向下箭头一次选择第四行。相反,当我按向下箭头时,顶部单元格周围有一个框架,当我再次按下它时,顶行被选中。

A WPF grid and a button

我应该如何创建我需要的行为?我已经尝试编辑后面的代码以明确地关注网格,但这不起作用。

以下是该示例的完整代码。

<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>

3 个答案:

答案 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));
            }
        }