Вы можете попробовать прослушать событие PreviewLostKeyboardFocus и пометить его как обработанное, если вы не хотите отпускать фокус. Вот пример. У нас есть два столбца, и если вы поместите фокус в первый столбец, вы никогда не выйдете из него, пока не нажмете кнопку «Снять фокус»:
XAML
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Focus Sample" Height="300" Width="340">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<GroupBox Header="Press Release Focus to leave">
<StackPanel PreviewLostKeyboardFocus="StackPanel_PreviewLostKeyboardFocus">
<TextBox/>
<Button Content="Release Focus"
Click="ReleaseFocusClicked"/>
</StackPanel>
</GroupBox>
<GroupBox Header="Try to switch focus here:"
Grid.Column="1">
<TextBox/>
</GroupBox>
</Grid>
</Window>
C #
using System.Windows;
using System.Windows.Input;
namespace WpfApplication1
{
public partial class Window1 : Window
{
private bool _letGo;
public Window1()
{
InitializeComponent();
}
private void StackPanel_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
var uie = (UIElement) sender;
var newFocusDO = (DependencyObject)e.NewFocus;
if (!_letGo && !uie.IsAncestorOf(newFocusDO))
{
e.Handled = true;
}
}
private void ReleaseFocusClicked(object sender, RoutedEventArgs e)
{
_letGo = true;
}
}
}
Я делаю еще одну проверку, чтобы убедиться, что новая цель фокусировки принадлежит нашей панели. Если мы этого не сделаем, мы никогда не позволим фокусу уйти от текущего сфокусированного элемента. Стоит отметить, что этот подход не удерживает пользователя от нажатия на другие кнопки в пользовательском интерфейсе. Он просто держит фокус.
Надеюсь, это поможет.
Приветствия, Анвака.