wpf datagrid popup focus

WPF Popup focus en la grilla de datos



datagrid (4)

Estoy creando un UserControl personalizado para usar dentro de una plantilla de edición de DataGrid. Se parece a esto:

<UserControl x:Class="HR.Controls.UserPicker" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <TextBlock x:Name="PART_TextBox" Text="Hello WOrld" /> <Popup Width="234" Height="175" IsOpen="True" StaysOpen="True" Placement="Bottom" PlacementTarget="{Binding ElementName=PART_TextBox}" > <TextBox x:Name="searchTextBox" Text="&gt;Enter Name&lt;"/> </Popup> </Grid> </UserControl>

editar: he reducido el código un poco. Parece que si pongo un Popup con un cuadro de texto dentro de CellEditingTemplate directamente, el cuadro de texto no se enfoca. Cuando muevo ese código a UserControl, ya no puedo seleccionar el cuadro de texto cuando edito la celda.

¿El UserControl está haciendo algo divertido con el enfoque?

El problema es que cuando edito la celda en la cuadrícula de datos obtengo el control de usuario que aparece pero no puedo hacer clic en TextBox searchTextBox. Cuando hago clic en él, la ventana emergente se cierra y la celda vuelve al estado predeterminado.

He intentado copiar y pegar todo el código dentro del control de usuario y pegarlo directamente en CellEditingTemplate y eso interactúa de la manera que debería.

Me preguntaba si el UserControl hizo algo raro que evita que una ventana emergente se enfoque porque funciona como se esperaba cuando se coloca directamente en CellEditingTemplate.

Gracias, Raul


Tuve un problema similar, creé un control de usuario que contenía un cuadro de texto, un botón y un calendario. Básicamente, creo mi propio datepicker con una lógica de validación personalizada.

Puse este componente en una CellEditingTemplate. Cuando presioné el botón, apareció la ventana emergente, pero al hacer clic en la ventana emergente en cualquier lugar, la celda dejó de editarse (porque la ventana emergente estaba enfocando desde el cuadro de texto). Lo resolví agregando un código que indica que si la ventana emergente está abierta, el foco del cuadro de texto no se perderá. Esto hizo el truco para mí.

Además, en el controlador de eventos cargado del control de usuario le doy foco al cuadro de texto. En su caso, es propagadamente el Usercontrol itsefl que tiene foco.

protected override void OnPreviewLostKeyboardFocus(KeyboardFocusChangedEventArgs e) { // Don''t allow focus to leave the textbox if the popup is open if (Popup.IsOpen) e.Handled = true; } private void Root_Loaded(object sender, RoutedEventArgs e) { TextBox.Focus(); }


Tuve un problema similar cuando una Popup incrustada en un UserControl como una plantilla de edición de celda se cerraría cuando se hicieran clic en ciertas áreas de la misma. El problema resultó ser que WPF Toolkit (y presumiblemente WPF4) DataGrid es muy codicioso con los clics del mouse izquierdo. Incluso cuando los maneja y configura Handled en true, la grilla puede interpretarlos como haciendo clic en una celda diferente.

Este hilo tiene todos los detalles, pero la solución es conectar el evento DataGrid.CellEditEnding y cancelar la edición final:

private static void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) { if (e.Column.GetType() == typeof(DataGridTemplateColumn)) { var popup = GetVisualChild<Popup>(e.EditingElement); if (popup != null && popup.IsOpen) { e.Cancel = true; } } } private static T GetVisualChild<T>(DependencyObject visual) where T : DependencyObject { if (visual == null) return null; var count = VisualTreeHelper.GetChildrenCount(visual); for (int i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(visual, i); var childOfTypeT = child as T ?? GetVisualChild<T>(child); if (childOfTypeT != null) return childOfTypeT; } return null; }

El crédito completo para esto va al hilo de Actipro .


No estoy seguro si esto ayudará a alguien, pero esto ayuda si tiene controles personalizados en la cuadrícula de datos con una ventana emergente ..... esto solucionó mi problema, y ​​era una línea de xaml. Paso todo el día releyendo este foro y luego mirando la fuente de DataGridCell. Espero que esto ayude.

<Style TargetType="{x:Type DataGridCell}"> <Setter Property="Focusable" Value="False"></Setter> </Style>