2017-06-29 45 views
-1

我用這個方法來列出用戶控件的所有按鈕:VisualTreeHelper沒有找到控制DataGridTemplateColumn.CellTemplate

private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     int NbChild = VisualTreeHelper.GetChildrenCount(depObj); 

     for (int i = 0; i < NbChild; i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 

      if (child != null && child is T) 
      { 
       yield return (T)child; 
      } 

      foreach (T childNiv2 in FindVisualChildren<T>(child)) 
      { 
       yield return childNiv2; 
      } 
     } 
    } 
} 
public static void ImplementShortCut(ContentControl page) 
{ 
    List<Button> ListButton = new List<Button>(); 
    ListButton = FindVisualChildren<Button>(page).ToList(); 
    .... 
} 

它的工作很好,除了按鍵內部DataGridTemplateColumn.CellTemplate

<DataGridTemplateColumn>      
<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel> 
      <Button x:Name="Btn_Edit" 
        Click="Btn_EditTest_Click"/> 
     </StackPanel> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 

'VisualTreeHelper.GetChild'do es似乎無法在datagrid項目中找到控件。

+0

應該工作。什麼是「頁面」,您在哪裏調用該方法? – mm8

+0

'page'是一個UserControl,該方法在load方法(TestPage_Loaded)中調用,它自己在'page'的構造函數中調用(this.Loaded + = TestPage_Loaded;)但是我沒有任何問題在數據網格之外按鈕! ! – Alematt

+0

這是不可理解的...請發佈您的代碼。 DataGrid是否位於「頁面」中? – mm8

回答

0

我班

public class ShortCutUtils 
{ 
    public static void ImplementShortCut(ContentControl page) 
    { 
    List<Button> ListButton = new List<Button>(); 
    ListButton = FindVisualChildren<Button>(page).ToList(); 
     ... 
    } 


private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
if (depObj != null) 
    { 
    int NbChild = VisualTreeHelper.GetChildrenCount(depObj); 

    for (int i = 0; i < NbChild; i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 

     if (child != null && child is T) 
     { 
      yield return (T)child; 
     } 

     foreach (T childNiv2 in FindVisualChildren<T>(child)) 
     { 
      yield return childNiv2; 
     } 
    } 
    } 
} 
} 

TestPage XAML

  <DataGrid Grid.Row="0" x:Name="Dg_Test" 
       Margin="2" 
       AutoGenerateColumns="False" 
       SelectedCellsChanged="dg_Test_SelectionChanged" 
       SelectionMode="Single" 
       MouseLeftButtonDown="Dg_TestMouseClick" 
       RowDetailsVisibilityMode="{Binding RowDetailsVisible}" 
       ScrollViewer.VerticalScrollBarVisibility="Visible" 
       Style="{StaticResource DatagridDesktopStyle}"> 

       <DataGrid.Columns> 
        ... 
        <DataGridTemplateColumn Width="auto" IsReadOnly="True" Header=""> 
         DataGridTemplateColumn.HeaderTemplate> 
         ... 
         </DataGridTemplateColumn.HeaderTemplate> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <StackPanel> 
            <Button x:Name="Btn_Edit" 
              Click="Btn_EditTest_Click"/> 
           </StackPanel> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
       </DataGrid.Columns> 
     </DataGrid> 

TestPage代碼

public partial class TestPage : UserControl 
{ 
    public TestPage() 
    { 
    InitializeComponent(); 
    this.Loaded += TestListPage_Loaded; 
    this.DataContext = this; 
    } 


    private async void TestListPage_Loaded(object sender, RoutedEventArgs e) 
    { 
    ShortCutUtils.ImplementShortCut(this); 
    } 
} 
0

由於假定swiszcz,所有的控制都沒有完成調用「ShortCutUtils時加載.ImplementShortCut(t他的)'方法在'加載'的末尾。爲了解決這個問題,因此我放在這個方法在低優先級「調用」

Application.Current.Dispatcher.Invoke(() => 
{ShortCutUtils.ImplementShortCut (this); 
}, DispatcherPriority.Render); 

,它工作正常!非常感謝你