Si llamo SelectAll
desde unGotFocus
controlador de eventos, no funciona con el mouse; la selección desaparece tan pronto como se suelta el mouse.
EDITAR: A la gente le gusta la respuesta de Donnelle, intentaré explicar por qué no me gustó tanto como la respuesta aceptada.
- Es más complejo, mientras que la respuesta aceptada hace lo mismo de una manera más simple.
- La usabilidad de la respuesta aceptada es mejor. Cuando hace clic en el medio del texto, el texto no se selecciona cuando suelta el mouse, lo que le permite comenzar a editar instantáneamente, y si aún desea seleccionar todo, simplemente presione el botón nuevamente y esta vez no se anulará la selección. Siguiendo la receta de Donelle, si hago clic en el medio del texto, tengo que hacer clic por segunda vez para poder editar. Si hago clic en algún lugar dentro del texto en lugar de fuera del texto, lo más probable es que quiera comenzar a editar en lugar de sobrescribir todo.
.net
wpf
silverlight
textbox
Sergey Aldoukhov
fuente
fuente
Respuestas:
No sé por qué pierde la selección en el
GotFocus
evento.Pero una solución es hacer la selección en
GotKeyboardFocus
y losGotMouseCapture
eventos. De esa manera siempre funcionará.fuente
Lo tenemos para que el primer clic seleccione todo, y otro clic va al cursor (nuestra aplicación está diseñada para usar en tabletas con bolígrafos).
Tu podrias encontrar esto útil.
fuente
SelectAllText
método detextBox.IsFocused
mejora. No querrás seleccionar todo cuandoGetKeyboardFocus
se deba al uso alternativo del programa.La respuesta de Donnelle funciona mejor, pero tener que derivar una nueva clase para usarla es una molestia.
En lugar de hacerlo, registro los controladores en App.xaml.cs para todos los cuadros de texto de la aplicación. Esto me permite usar la respuesta de Donnelle con el control TextBox estándar.
Agregue los siguientes métodos a su App.xaml.cs:
fuente
Esto es bastante antiguo, pero mostraré mi respuesta de todos modos.
Elegí parte de la respuesta de Donnelle (omití el doble clic) porque creo que es más natural. Sin embargo, al igual que gcores, no me gusta la necesidad de crear una clase derivada. Pero tampoco me gusta el
OnStartup
método gcores . Y necesito esto sobre una base "generalmente pero no siempre".He implementado esto como adjunto
DependencyProperty
para poder configurarlolocal:SelectTextOnFocus.Active = "True"
en xaml. De esta manera me parece lo más agradable.Para mi característica "general pero no siempre" configuré esta propiedad Attache
True
en a (global)TextBox
Style
. De esta forma, "seleccionar el texto" siempre está "activado", pero puedo deshabilitarlo por cuadro de texto.fuente
Estos son los comportamientos de Blend que implementan la solución de respuesta para su conveniencia:
Uno para adjuntar a un solo cuadro de texto:
Y uno para adjuntar a la raíz de un contenedor que contiene múltiples TextBox'es:
fuente
Aunque esta es una vieja pregunta, acabo de tener este problema, pero lo resolví usando un Comportamiento Adjunto, en lugar de un Comportamiento de Expresión como en la respuesta de Sergey. Esto significa que no necesito una dependencia
System.Windows.Interactivity
en el SDK de Blend:Luego puede usarlo en su XAML de esta manera:
Blogueé sobre esto aquí .
fuente
Aquí hay una muy buena solución muy simple en MSDN :
Aquí está el código detrás:
fuente
Creo que esto funciona bien:
Si desea implementarlo como un método de extensión:
Y en tu
GotFocus
caso:Descubrí la solución anterior porque hace varios meses estaba buscando una manera de enfocarme en un determinado
UIElement
. Descubrí el código a continuación en alguna parte (se otorga crédito) y funciona bien. Lo publico a pesar de que no está directamente relacionado con la pregunta del OP porque demuestra el mismo patrón de usoDispatcher
para trabajar con aUIElement
.fuente
Aquí hay un intento de resolver algunos de los problemas con otras soluciones:
El código que escribí es configurable. Se puede elegir en las acciones que el seleccionar todo comportamiento debe ocurrir mediante el establecimiento de tres campos de sólo lectura:
SelectOnKeybourdFocus
,SelectOnMouseLeftClick
,SelectOnMouseRightClick
.La desventaja de esta solución es que es más compleja y se almacena el estado estático. Parece una lucha fea con el comportamiento predeterminado del
TextBox
control. Aún así, funciona y todo el código está oculto en la clase de contenedor Propiedad adjunta.Para adjuntar la propiedad adjunta a un
TextBox
, todo lo que necesita hacer es agregar el espacio de nombres xml (xmlns
) de la propiedad adjunta y luego usarlo así:Algunas notas sobre esta solución:
TextBox
recuerda su selección después de que pierde el foco. De hecho, he anulado este comportamiento.TextBox
(FirstActionIsMouseDown
campo estático).ContextMenu
campo estático).El único efecto secundario que encontré es cuando
SelectOnMouseRightClick
es cierto. A veces, el menú contextual del botón derecho parpadea cuando se abre y al hacer clic derecho en un espacio en blancoTextBox
no se selecciona "seleccionar todo".fuente
No he encontrado que ninguna de las respuestas presentadas aquí imite un cuadro de texto estándar de Windows. Por ejemplo, intente hacer clic en el espacio en blanco entre el último carácter del cuadro de texto y el lado derecho del cuadro de texto. La mayoría de las soluciones aquí siempre seleccionarán todo el contenido, lo que hace que sea muy difícil agregar texto a un cuadro de texto.
La respuesta que presento aquí se comporta mejor a este respecto. Es un comportamiento (por lo que requiere el ensamblaje System.Windows.Interactivity del Blend SDK ). También podría reescribirse usando las propiedades adjuntas.
Esto se basa en el código que encontré aquí .
fuente
Esta implementación simple funciona perfectamente para mí:
Para aplicarlo a todos
TextBox
, coloque el siguiente código despuésInitializeComponent();
fuente
En el archivo App.xaml:
En el archivo App.xaml.cs:
Con este código llega a todos
TextBox
en su aplicación.fuente
Tomado de aquí :
Registre el controlador de eventos global en el archivo App.xaml.cs:
Entonces el controlador es tan simple como:
fuente
Me doy cuenta de que esto es muy antiguo, pero aquí está mi solución que se basa en las expresiones / interactividad de Microsoft y los espacios de nombres de interacciones.
Primero, seguí las instrucciones en este enlace para colocar los disparadores de interactividad en un estilo.
Entonces todo se reduce a esto
y esto
En mi caso, tengo un control de usuario donde están los cuadros de texto que tienen un código subyacente. El código subyacente tiene la función de controlador. Le di a mi usuario un nombre de control en XAML y estoy usando ese nombre para el elemento. Esto está funcionando perfectamente para mí. Simplemente aplique el estilo a cualquier lugar
TextBox
donde le gustaría tener todo el texto seleccionado al hacer clic en elTextBox
.El primero
CallMethodAction
llama alSelectAll
método del cuadro de texto cuando se dispara elGotKeyboardFocus
eventoTextBox
.Espero que esto ayude.
fuente
He usado la respuesta de Nils pero la he convertido a una más flexible.
En XAML, puede usar uno de estos:
fuente
Aquí está la versión C # de la respuesta publicada por @Nasenbaer
mientras
MyTextBox_GotFocus
que el controlador de eventos está asignado alGotFocus
evento deMyTextBox
.fuente
Tengo una respuesta ligeramente simplificada para esto (con solo el
PreviewMouseLeftButtonDown
evento) que parece imitar la funcionalidad habitual de un navegador:En XAML tienes algo que
TextBox
decir:En código detrás:
fuente
Pruebe este método de extensión para agregar el comportamiento deseado a cualquier control TextBox. Todavía no lo he probado exhaustivamente, pero parece satisfacer mis necesidades.
fuente
Busqué mucho la solución, encontré un par de soluciones para seleccionar, pero el problema es que cuando hacemos clic derecho y cortamos / copiamos después de seleccionar parte del texto del cuadro de texto, selecciona todo incluso seleccioné parte del texto. Para solucionar esto aquí está la solución. Simplemente agregue el siguiente código en el evento de selección de teclado. Esto funcionó para mí.
fuente
Tuve el mismo problema En VB.Net funciona fácil de esa manera:
VB XAML:
Codehind:
C # (gracias a ViRuSTriNiTy)
fuente
Esta es, con mucho, la solución más simple.
Agregue un controlador global a la aplicación (App.xaml.cs) y listo. Necesitará solo unas pocas líneas de código.
Por lo tanto, use la clase EventManager para registrar un controlador de eventos global en un tipo (TextBox). El controlador real es muy simple:
Marque aquí: WPF TextBox SelectAll en foco
Espero eso ayude.
fuente
Para aquellos interesados en el enfoque de Donnelle / Groky, pero quieren un clic a la derecha del último carácter (pero aún dentro del
TextBox
) para colocar el cursor al final del texto ingresado, se me ocurrió esta solución:El
GetRoundedCharacterIndexFromPoint
método fue tomado de esta publicación.fuente
Después de buscar en Google y probar, encontré una solución simple que funcionó para mí.
Debe agregar un controlador de
Loaded
eventos al evento de su ventana de contenedor:A continuación, debe crear el controlador para el referenciado
RoutedEventHandler
en el código anterior:Ahora, puede agregar el
SelectAll()
comando en losGotFocus
controladores de eventos a cualquierTextBox
control por separado:Su texto ahora está seleccionado en foco!
Adaptado de la solución Dr. WPF, foros de MSDN
fuente
fuente
Esto parece funcionar bien para mí. Básicamente es un resumen de algunas publicaciones anteriores. Acabo de poner esto en mi archivo MainWindow.xaml.cs en el constructor. Creo dos controladores, uno para el teclado y otro para el mouse, y canalizo ambos eventos en la misma función
HandleGotFocusEvent
, que se define justo después del constructor en el mismo archivo.fuente
Una manera fácil de anular el mouseDown y seleccionar todo después de hacer doble clic es:
fuente
Intente poner esto en el constructor de cualquier control que contenga su cuadro de texto:
fuente
Si hay un evento que deselecciona el texto durante el
OnFocus
mouse, usualmente solo retraso la selección de todo.fuente
Los he probado todos, pero solo funcionó lo siguiente:
fuente
GetType().Name
lugar deis
oas
es bastante hackyVeo que hay muchas respuestas, pero como la aprobada, los métodos que deben usarse son
EditTextBoxGotCapture
con el siguiente código detrás:
fuente