Отследить клик за пределами UserControl
Есть TextBox, который сохраняет полученное значения после потери фокуса. Как реализовать потерю фокуса при при клике в любой точке окна, если TextBox находится в отдельном View (в UserControl)? При использовании Mouse.Capture событие происходит только в UserControl с TextBox, а присоединяться к главному окну проекта я не могу.
private void EditTextBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
AddHandler(Mouse.PreviewMouseDownEvent, new RoutedEventHandler(Foo));
Mouse.Capture(editTextBox, CaptureMode.None);
}
private void Foo(object sender, RoutedEventArgs e)
{
Trace.WriteLine("Click");
}
Ответы (1 шт):
Автор решения: Heliko
→ Ссылка
private TextBox _editTextBox;
private static bool _isRegister;
private void EditTextBox_PreviewMouseDownEvent(object sender, RoutedEventArgs e)
{
if (!_editTextBox.IsMouseOver)
{
_editTextBox.Text = _editTextBox.Text;
_editTextBox.RaiseEvent(new RoutedEventArgs(LostFocusEvent));
}
}
private void EditTextBox_Loaded(object sender, RoutedEventArgs e)
{
_editTextBox = (TextBox)sender;
if (!_isRegister)
{
EventManager.RegisterClassHandler(typeof(Window), PreviewMouseDownEvent, new RoutedEventHandler(EditTextBox_PreviewMouseDownEvent));
_isRegister = true;
}
}
TextBox:
<TextBox x:Name="EditTextBox"
Style="{StaticResource TextBoxRectangle}"
Text="{Binding Name, UpdateSourceTrigger=LostFocus}"
VerticalAlignment="Center"
MouseLeave="EditTextBox_MouseLeave"
MouseEnter="EditTextBox_MouseEnter"
Loaded="EditTextBox_Loaded"
Unloaded="EditTextBox_Unloaded">
</TextBox>
Name TextBox:
public string Name
{
get => _name;
set
{
if (_name == value)
{
IsEditing = false;
return;
}
_name = value;
IsEditing = false;
OnPropertyChanged();
}
}
Для чего нужен editTextBox.Text = editTextBox.Text:
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource NormalTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsEditing}" Value="true">
<Setter Property="ContentTemplate" Value="{StaticResource EditTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>