2015-06-03 4 views
0

Я использую xaml UserControl как часть приложения WPF. Я создал окно списка, которое я заполнил данными из текстового поиска. эти данные отображаются на кнопках, которые используются для выбора желаемого пользователя из поиска.Xaml Listbox item focus issue

<ScrollViewer HorizontalScrollBarVisibility="Auto" 
    VerticalScrollBarVisibility="Auto" 
    Margin="2"> 

    <ListBox ItemsSource="{Binding Path=CrewOptions}" 
     HorizontalContentAlignment="Stretch" 
     BorderThickness="0" 
     SelectionMode="Multiple" 
     Name="CrewOptionsListBox"> 

     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Button x:Name="irrelevant" 
        Height="28px" 
        Background="#F4F3E9" 
        Margin="2,2,2,2" 
        Content="{Binding irrelevant1, TargetNullValue={x:Static sys:String.Empty}}" 
        Command="{Binding irrelevant2}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 

     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}" 
      </Style> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 
</ScrollViewer> 

Это прекрасно работает, однако, когда я вкладка из текстового поля в поле со списком, а затем используйте клавиши со стрелками, чтобы выбрать опцию, введите нажатие клавиши не выбрать кнопку. Вместо этого мне нужно снова нажать вкладку, чтобы сфокусироваться на кнопке, прежде чем нажимать Enter, чтобы выбрать ее.

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

открыт как XAML и C# растворов (предпочтительно MVVM)

ответ

2

Привет Вы можете добавить ниже код в ListBox это позволит решить проблему фокусировки на ListBoxItem.

<ListView.ItemContainerStyle> 
     <Style TargetType="ContentControl"> 
      <Setter Property="Focusable" Value="False"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
+0

безупречный! Большое спасибо! – mattisrowe

0

Причина этого заключается в том, что вы каскадное управление. Когда вы используете клавиши со стрелками, поле «Список» является активным элементом управления, поэтому все события будут запущены на основе списка, а не кнопки.

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

что-то вроде:

listBox_keyPressed() 
{ 
    if(selecteditem) 
    { 
     DoSomethingFor(selectedItem); 
    } 
}