У меня полноэкранное приложение WPF, которое запускает внешние процессы, когда пользователь выбирает элемент из списка. Навигация по списку осуществляется в основном с помощью клавиатуры, а не мыши. Какой самый чистый способ немедленно вернуть фокус на список после того, как пользователь закрывает внешнее приложение? У меня это работает, но решение, на мой взгляд, не идеальное и немного "хакерское".
Вот XAML:
<ListBox SelectedIndex="{Binding ActiveSelection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsSynchronizedWithCurrentItem="True" x:Name="ListBoxSelector">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
И код:
private void Button_Click(object sender, RoutedEventArgs e)
{
var process = Process.Start(@"C:\Windows\system32\mspaint.exe");
process.WaitOnExit()
ActiveSelection += 1;
ActiveSelection -= 1;
}
Таким образом, в основном изменение ActiveSelection (и затем снова, чтобы та же самая вещь все еще была выбрана), кажется, фокусирует список сразу после закрытия программы MSPaint. Таким образом, я достиг желаемого результата, но я думаю, что, возможно, есть лучшее и более чистое решение.