WPF - Remove focus when clicking outside of a textbox WPF - Remove focus when clicking outside of a textbox wpf wpf

WPF - Remove focus when clicking outside of a textbox


Rather than adding new control to window, I think you should give your Grid a name and react to the MouseDown event on your window, moving the focus to the Grid itself. Something like this:

<Window x:Class="WpfApplication1.Window1"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     Title="Window1"     Height="412" Width="569"     MouseDown="Window_MouseDown"     Name="window1">    <Grid ShowGridLines="False"           Background="#01FFFFFF"          KeyDown="Grid_KeyDown"           Name="grid1"           Focusable="True">          <TextBox Width="120" Margin="117,61,0,0"                    Name="textBox1"                    VerticalAlignment="Top"                    HorizontalAlignment="Left"/>    </Grid></Window>

code behind:

private void window1_MouseDown(object sender, MouseButtonEventArgs e){    grid1.Focus();}


I think, better way to solve this problem is adding MouseDown event handler to window with code behind:

private void window_MouseDown(object sender, MouseButtonEventArgs e){    Keyboard.ClearFocus();}


Another way that worked for me was using

Mouse.AddPreviewMouseDownOutsideCapturedElementHandler

For example, say you had a TextBlock that when clicked, should become editable by showing a focused TextBox. Then when the user clicked outside the TextBox, it should be hidden again. Here's how you can do it:

private void YourTextBlock_OnMouseDown(object sender, MouseButtonEventArgs e){    YourTextBox.Visibility = Visibility.Visible;    YourTextBox.Focus();    CaptureMouse();    Mouse.AddPreviewMouseDownOutsideCapturedElementHandler(this, OnMouseDownOutsideElement);}private void OnMouseDownOutsideElement(object sender, MouseButtonEventArgs e){    Mouse.RemovePreviewMouseDownOutsideCapturedElementHandler(this, OnMouseDownOutsideElement);    ReleaseMouseCapture();    YourTextBox.Visibility = Visibility.Hidden;}