que - wpf tutorial español
Encontrar control dentro de WPF itemscontrol (5)
Es posible que desee intentar usar VisualTreeHelper . Las propiedades de ItemsControl solo le permitirán obtener los datos a los que está vinculado, no las instancias de plantilla utilizadas para visualizar los datos, mientras que VisualTreeHelper le permite explorar el árbol visual tal como lo ha representado WPF.
Si repite los elementos visuales hijos de ItemControl (recursivamente), no debería tener ninguna dificultad para ubicar los cuadros de texto que está viendo en la pantalla.
Hola, tengo pocos cuadros de texto dentro de la plantilla de datos para control de elementos. Cuando enlace los controles de elementos a una colección observable, obtengo dos cuadros de texto. Pero tengo que hacer algunas manipulaciones basadas en cada uno de los cuadros de texto para los cuales quiero encontrar cada cuadro de texto por separado usando alguna identificación.
¿Alguien puede ayudarme a encontrar un control en el control de elementos en WPF?
Gracias Bryce, traté de marcar la flecha hacia arriba, pero dice que mi calificación es muy baja. ¡Lo siento!
Modifiqué el código para devolver toda una lista de todos los niños del tipo dado, ya que era lo que necesitaba y pensé que alguien más podría encontrarlo útil.
Gracias de nuevo Bryce, realmente útil, lo siento por la calificación.
public static List<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
List<T> list = new List<T>();
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
list.Add((T)child);
}
List<T> childItems = FindVisualChildren<T>(child);
if (childItems != null && childItems.Count() > 0)
{
foreach (var item in childItems)
{
list.Add(item);
}
}
}
}
return list;
}
Otro ejemplo:
private void DataGridBank_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
try
{
switch (e.Key)
{
case Key.Down:
if ((DataGridBank.SelectedIndex + 1) <= DataGridBank.Items.Count)
{
DataGridBank.SelectedIndex = DataGridBank.SelectedIndex + 1;
FocusCell();
}
break;
case Key.Up:
if ((DataGridBank.SelectedIndex - 1) >= 0)
{
DataGridBank.SelectedIndex = DataGridBank.SelectedIndex - 1;
FocusCell();
}
break;
case Key.Enter:
case Key.Tab:
FocusCell();
break;
}
}
catch (Exception ex)
{
}
}
private void DataGridBank_Loaded(object sender, RoutedEventArgs e)
{
try
{
if (DataGridBank.Items.Count > 0)
{
DataGridBank.SelectedIndex = 0;
FocusCell();
}
}catch(Exception ex)
{
}
}
private void FocusCell()
{
var selectedRow = (DataGridRow)DataGridBank.ItemContainerGenerator.ContainerFromItem(DataGridBank.SelectedItem);
var textImport = FindVisualChild<TextBox>(selectedRow);
textImport.Focus();
textImport.SelectAll();
}
public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
return (T)child;
}
T childItem = FindVisualChild<T>(child);
if (childItem != null) return childItem;
}
}
return null;
}
Si tiene una cuadrícula de datos y una columna de plantilla, que contiene una plantilla de datos, puede usar la siguiente muestra de código
<DataGridTemplateColumn x:Name="photoPathColumn" Header="{x:Static resx:FrmResource.Photo}">
<DataGridTemplateColumn.CellEditingTemplate x:Uid="keyelm">
<DataTemplate x:Name="dodo">
<StackPanel Orientation="Horizontal" Height="Auto">
<TextBlock x:Name="photo" x:Uid="imageFile" Text="{Binding Path=PhotoPath}" />
<Button x:Name="Browse" Content="..." Click="Browse_Click" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
photoPathColumn.CellEditingTemplate.FindName("photo",photoPathColumn.GetCellContent(CustomersDataGrid.CurrentItem))
Usando ItemContainerGenerator puede obtener el contenedor generado para un artículo y recorrer el árbol visual hacia abajo para encontrar su TextBox. En el caso de un ItemsControl, será un ContentPresenter, pero un ListBox devolverá un ListBoxItem, ListView a ListViewItem, etc.
ContentPresenter cp = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;
TextBox tb = FindVisualChild<TextBox>(cp);
if (tb != null)
{
// do something with tb
}
public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
return (T)child;
}
T childItem = FindVisualChild<T>(child);
if (childItem != null) return childItem;
}
}
return null;
}
También puede obtener el contenedor por índice si lo desea utilizando
itemsControl.ItemContainerGenerator.ContainerFromIndex(0);