2009-06-11 52 views
21

Xin chào, tôi có vài hộp văn bản đơn trong bảng dữ liệu cho mục kiểm soát. Khi tôi liên kết các itemcontrols với một bộ sưu tập quan sát, tôi nhận được hai hộp văn bản. Nhưng tôi cần phải làm một số thao tác dựa trên mỗi hộp văn bản mà tôi muốn tìm mỗi hộp văn bản seperatly sử dụng một số id.Tìm điều khiển trong WPF itemscontrol

Ai đó có thể giúp tìm cách kiểm soát việc kiểm soát mục trong WPF.

+1

Những loại thao tác làm bạn cần phải thực hiện? Bạn có cần phải xác định các hộp văn bản duy nhất trong số tất cả các mục của itemscontrol hoặc chỉ để tách hai hộp này ra khỏi nhau? – Oskar

+0

Xin chào Oscar Tôi chỉ có nhãn và hộp văn bản bên trong mục kiểm soát của tôi. Tôi cần một cách để có được xử lý để kiểm soát hộp văn bản duy nhất (sử dụng một số id). Nhu cầu cơ bản để đặt trọng tâm vào hộp văn bản khi mục kiểm soát được tải và cần phải xác định hộp văn bản nào đã tập trung tại một thời điểm nhất định và thực hiện một số thao tác. Cảm ơn Deepak Cảm ơn Deepak – deepak

+0

Chỉ đơn giản là làm thế nào tôi có thể lặp qua bộ sưu tập kiểm soát mục kiểm soát bằng C#. – deepak

Trả lời

62

Sử dụng mụcContainerGenerator, bạn có thể lấy vùng chứa đã tạo cho một mục và duyệt cây nhìn xuống để tìm TextBox của bạn. Trong trường hợp của một ItemsControl nó sẽ là một ContentPresenter, nhưng một ListBox sẽ trả về một ListBoxItem, ListView một ListViewItem vv

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; 
} 

Bạn cũng có thể lấy các thùng chứa bằng chỉ số nếu bạn muốn bằng cách sử dụng

itemsControl.ItemContainerGenerator.ContainerFromIndex(0); 
+0

Cảm ơn rất nhiều Bryce – deepak

+0

Bạn có thể đánh dấu là câu trả lời được không? –

+0

Tôi đang sử dụng phương pháp này, nhưng tôi đang gọi nó trong hàm tạo. (Ý tưởng tồi?) Dù sao đi nữa, tôi phải gọi child.ApplyTemplate(); để có được cây thị giác để cư trú cho trẻ em với các mẫu được xác định trong tài nguyên tĩnh. –

2

Bạn có thể muốn thử sử dụng VisualTreeHelper. Các thuộc tính trên ItemsControl chính nó sẽ chỉ cho phép bạn để có được dữ liệu của nó ràng buộc, không phải là trường hợp mẫu được sử dụng để hình dung dữ liệu, trong khi VisualTreeHelper cho phép bạn duyệt xung quanh cây thị giác như WPF đã trả lại nó.

Nếu bạn lặp qua con cái của cha mẹ ItemControl (đệ quy), bạn không nên gặp khó khăn khi định vị các hộp văn bản mà bạn đang nhìn thấy trên màn hình.

5

Cảm ơn Bryce, tôi đã cố gắng đánh dấu vào mũi tên lên nhưng nó nói rằng xếp hạng của tôi quá thấp! Lấy làm tiếc!

Tôi đã sửa đổi mã để trả về tất cả danh sách tất cả trẻ em thuộc loại đã cho vì đó là những gì tôi cần và nghĩ rằng ai đó có thể thấy nó hữu ích.

Cảm ơn Bryce lần nữa, thực sự hữu ích - xin lỗi về điều xếp hạng!

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; 
    } 
+0

Gần đây tôi đã đăng một biến thể nhỏ về những gì bạn đang cố gắng làm ở đây: http://stackoverflow.com/questions/974598/find-all-controls-in-wpf-window-by-type –

+0

@Clarke: Một sửa chữa nhỏ - nó phải là 'childItems.Count' thay vì' childItems.Count() '. –

0

Nếu bạn có lưới dữ liệu và cột mẫu, trong đó có mẫu dữ liệu, bạn có thể sử dụng mẫu mã sau đây

<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)) 
1

Một ví dụ khác:

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; 
    } 
Các vấn đề liên quan