simular - mostrar mensaje en textbox c#
WPF: eliminar el enfoque al hacer clic fuera de un cuadro de texto (10)
Tengo algunos cuadros de texto donde me gustaría que el enfoque se comporte de manera un poco diferente a lo normal para una aplicación WPF. Básicamente, me gustaría que se comportaran más como un cuadro de texto se comporta en una página web. Es decir, si hago clic en cualquier lugar fuera del cuadro de texto, perderá su enfoque. ¿Cual es la mejor manera de hacerlo?
Si la respuesta es eliminar el enfoque mediante programación, ¿cuál es la mejor manera de detectar un Mouseclick fuera de los límites? ¿Qué sucede si el elemento en el que hago clic será el nuevo destinatario del enfoque?
Creo que, una mejor manera de resolver este problema es agregar el controlador de eventos MouseDown a la ventana con código detrás:
private void window_MouseDown(object sender, MouseButtonEventArgs e)
{
Keyboard.ClearFocus();
}
He intentado la respuesta seleccionada en la aplicación WPF nativa de reacción, pero no estaba activando el foco de cuadro de texto perdido debido a qué cuadro de texto no estaba perdiendo el foco. Siguiendo la solución de trabajo para mí.
Bound un evento de mouse-down a la ventana
<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" KeyDown="Grid_KeyDown" Name="grid1" Focusable="True">
<TextBox HorizontalAlignment="Left" Margin="117,61,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
</Grid>
</Window>
y el evento es:
private void window_MouseDown(object sender, MouseButtonEventArgs e)
{
TextBox textBox = Keyboard.FocusedElement as TextBox;
if (textBox != null)
{
TraversalRequest tRequest = new TraversalRequest(FocusNavigationDirection.Next);
textBox.MoveFocus(tRequest);
}
}
Me encontré con un problema similar, pero cuando envolvía mis cuadros de texto alrededor de un control ScrollViewer, todos los cuadros de texto perderían el foco automáticamente al hacer clic en cualquier lugar fuera de los cuadros de texto.
No estoy 100% seguro, pero si establece Focusable
en true en el elemento contenedor (Grid, StackPanel, etc.), debería quitar el foco del cuadro de texto.
Otra forma que funcionó para mí fue usando
Mouse.AddPreviewMouseDownOutsideCapturedElementHandler
Por ejemplo, digamos que tenía un TextBlock que al hacer clic, debería ser editable al mostrar un TextBox enfocado. Luego, cuando el usuario hace clic fuera del TextBox, debería ocultarse nuevamente. Así es como puedes hacerlo:
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;
}
Para evitar el código detrás de usted puede utilizar este comportamiento El comportamiento
public class ClearFocusOnClickBehavior : Behavior<FrameworkElement>
{
protected override void OnAttached()
{
AssociatedObject.MouseDown += AssociatedObject_MouseDown;
base.OnAttached();
}
private static void AssociatedObject_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
Keyboard.ClearFocus();
}
protected override void OnDetaching()
{
AssociatedObject.MouseDown -= AssociatedObject_MouseDown;
}
}
Utilizando en XAML:
En cualquier elemento fuera del cuadro de texto en el que desea que desactive el enfoque, haga clic en agregar:
<i:Interaction.Behaviors>
<behaviors:ClearFocusOnClickBehavior/>
</i:Interaction.Behaviors>
Puedes usar el evento IsKeyboardFocusedChanged
:
myTextBox.IsKeyboardFocusedChanged += myTextBox_IsKeyboardFocusedChanged;
private void SendFileCaptionTextBox_IsKeyboardFocusedChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue.ToString() == "True")
{
// it''s focused
}
else
{
// it''s not focused
}
}
Si hace clic en el elemento, que puede captar el foco, obtiene lo que necesita. Si, por ejemplo, tiene algún panel, puede manejar el evento mouseClick del panel para satisfacer sus necesidades, o usar el consejo de Richard Szalay.
en lugar de agregar un nuevo control a la ventana, creo que debería agregar un nombre a su cuadrícula y, al hacer clic, incluso en el conjunto de ventanas, enfocar en la cuadrícula algo como esto
<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" KeyDown="Grid_KeyDown" Name="grid1" Focusable="True">
<TextBox HorizontalAlignment="Left" Margin="117,61,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
</Grid>
</Window>
código detrás:
private void window1_MouseDown(object sender, MouseButtonEventArgs e)
{
grid1.Focus();
}
no se puede perder explícitamente el enfoque de un control
En su lugar, puede establecer el enfoque en otro control.
**txt.Focusable=true;
label.focus();
Keyboard.Focus(txtPassword);**
prueba esto