我做了自动完成,我想在列表框中用上下键完成结果,在此之前,我必须从写文字的文本框中聚焦列表框的第一项。
<TextBox Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Name="Client" Text="{Binding Client}" cal:Message.Attach="[Event KeyUp] = [Action ExecuteFilterView($executionContext)]" Validation.ErrorTemplate="{x:Null}" >
<TextBox.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding UserCanChooseClient}" Value="True">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=Clients}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<ListBox x:Name="Clients" Width="190" Height="auto" MaxHeight="400" Margin="5 28 0 0" cal:Message.Attach="[Event KeyUp] = [Action ExecuteClientsView($executionContext)]; [Event MouseLeftButtonUp]=[Action HandleClientChosenClick($eventArgs)]" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectedItem="{Binding Path=SelectedClient}" ItemsSource="{Binding Path=Clients}" DisplayMemberPath="Description" SelectedValuePath="Code"></ListBox>
但焦点管理器关注的是列表框,而不是第一项。我必须按下两次按钮才能开始在列表中穿行。改变listbox中的SelectedClient属性也没有用。
在Listbox发送的SelectionChanged事件或其他事件中,我必须把焦点放在第一个项目上。
cal:Message.Attach="[Event SelectionChanged] = [Action LstBox_OnSelectionChanged($source, $eventArgs]"
public void LstBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var lstbox = (ListBox) sender;
var item = (ListBoxItem)lstbox.ItemContainerGenerator.ContainerFromItem(lstbox.SelectedItem);
if (item != null)
item.Focus();
}
如果你想在启动时选择listbox的第一项,你可以使用事件Loaded:
cal:Message.Attach="[Event Loaded] = [Action LstBox_OnLoaded($source)]"
public void LstBox_OnLoaded(object sender)
{
var lstbox = (ListBox)sender;
lstbox.SelectedIndex = 0;
var item = (ListBoxItem)lstbox.ItemContainerGenerator.ContainerFromItem(lstbox.SelectedItem);
if (item != null)
item.Focus();
}