Я хочу сфокусировать на клавиатуре конкретный экземпляр шаблона элемента 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](https://i.stack.imgur.com/aeixK.png)