Как сфокусироваться на клавиатуре при нажатии на элемент шаблона экземпляра ListBox? - PullRequest
0 голосов
/ 05 апреля 2019

Я хочу сфокусировать на клавиатуре конкретный экземпляр шаблона элемента ListBox при нажатии.Вместо того, чтобы получить фокус клавиатуры, экземпляр теряет его.

Я использую .NET Framework 4.6.1.Если это имеет значение, пользовательский контроль WPF встроен в панель WinForms.Я видел этот ответ , но я не считаю его полезным, потому что:

  • Я не использую ListBoxItem s (потому что я использую ListBox.ItemTemplate и я не знаюЯ могу использовать ItemsSource вместе с ListBoxItem s).
  • Я хочу иметь множественный выбор, но мне хотелось бы программно (надеюсь, через привязку к свойству Checked элемента в данных) решить, какие элементывыделены и отображают выделение в виде некоторого флажка внутри ItemTemplate.
  • Я хочу реализовать перетаскивание с множественным выбором внутри этого ListBox.Я еще не проанализировал элемент управления ListView, и если бы он помог мне больше, чем ListBox для множественного перетаскиваемого выделения и удаления заполнителя.

Ресурс данных:

<XmlDataProvider x:Key="xmlData">
    <x:XData>
        <Inventory xmlns="">
            <ClockData />
            <ClockData />
        </Inventory>
    </x:XData>
</XmlDataProvider>

Основной UserControl'sсодержание:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
            ScrollViewer.VerticalScrollBarVisibility="Auto"
            ItemsSource="{Binding Source={StaticResource xmlData}, XPath=Inventory/ClockData}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True"></WrapPanel>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <wpf:TimeSpanPicker Width="100" Height="50"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

<wpf:TimeSpanPicker>:

<UserControl x:Class="wpf_timespanpicker.TimeSpanPicker"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:wpf_timespanpicker"
             mc:Ignorable="d" 
             d:DesignHeight="170" d:DesignWidth="365"

             KeyboardNavigation.TabNavigation="Continue"
             IsTabStop="True"
             Focusable="True"

             GotKeyboardFocus="UserControl_GotKeyboardFocus"
             LostKeyboardFocus="UserControl_LostKeyboardFocus"

             PreviewMouseDown="UserControl_PreviewMouseDown">
    <Canvas Background="Yellow"></Canvas>
</UserControl>

Его код-позади:

private void UserControl_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{ // tracepoint: got kbd focus
}

private void UserControl_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{ // tracepoint: lost kbd focus
}

private void UserControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    // tracepoint: mouse down => kbd focus
    Keyboard.Focus(this);
    // tracepoint: theoretically kbd focus set
}

С кодом выше, когда я нажимаю на ListBoxДля каждого клика на панели «Вывод» имеются следующие строки:

mouse down => kbd focus
got kbd focus
theoretically kbd focus set
lost kbd focus

Выбранный элемент получает фокус, затем автоматически теряет фокус.То, что я хочу видеть на панели «Вывод», выглядит примерно так:

mouse down => kbd focus
got kbd focus
theoretically kbd focus set

Если я заменим ListBox на ItemsControl, фокус будет работать так, как я хочу, вывод будет таким же, как последний выводнаписано выше.

Не имеет значения скриншот:

screenshot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...