Сохранить состояние фокуса сетки даже при нажатии левой кнопки - PullRequest
3 голосов
/ 14 июля 2011

У меня есть сетка и кнопка. Я хочу иметь возможность нажать стрелка вниз , чтобы выбрать строку, затем нажать кнопку, затем нажать стрелка вниз , чтобы выбрать следующий ряд, а затем нажать кнопку.

Однако, когда я нажимаю на кнопку, фокус сетки клавиатуры больше не находится на строке.

Вот пример. На этой картинке у меня выбран третий ряд. Мне нужно следующее поведение: я щелкаю мышью по Нажмите Me , затем нажмите стрелку вниз на клавиатуре один раз, чтобы выбрать четвертый ряд. Вместо этого, когда я нажимаю стрелка вниз , вокруг верхней ячейки появляется рамка, а когда я нажимаю ее снова, выбирается верхняя строка.

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 ]

2 голосов
/ 14 июля 2011

Я думаю, что вы ищете Присоединенное свойство 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 голос
/ 14 июля 2011

Хак, но это работает

 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));
            }
        }
1 голос
/ 14 июля 2011

Просто Focusable = "False" для вашей кнопки.У меня это работает.

<Button Margin="3,3,3,3" Width="Auto" Height="Auto" HorizontalAlignment="Left" Focusable="False">_Press Me!</Button>
...