Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VisualTreeHelper不';在DataGridTemplateColumn.CellTemplate中找不到控件_C#_Wpf_Visualtreehelper_Celltemplate - Fatal编程技术网

C# VisualTreeHelper不';在DataGridTemplateColumn.CellTemplate中找不到控件

C# VisualTreeHelper不';在DataGridTemplateColumn.CellTemplate中找不到控件,c#,wpf,visualtreehelper,celltemplate,C#,Wpf,Visualtreehelper,Celltemplate,我使用此方法列出usercontrol的所有按钮: private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject { if (depObj != null) { int NbChild = VisualTreeHelper.GetChildrenCount(depObj); fo

我使用此方法列出usercontrol的所有按钮:

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();
  ....
}
私有静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
if(depObj!=null)
{
int NbChild=visualtreeheloper.GetChildrenCount(depObj);
for(int i=0;i
除了DataGridTemplateColumn.CellTemplate中的按钮外,它工作正常

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

VisualTreeHelper.GetChild”似乎无法在datagrid项中找到控件。

My class

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

假设swiszcz,当调用“Load”末尾的“shortcutils.ImplementShortCut(this)”方法时,所有控件都没有加载完毕。为了解决这个问题,我将这个方法放在一个低优先级的“调用”中

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

而且效果很好!非常感谢你

应该可以。什么是“page”,在哪里调用该方法?“page”是一个用户控件,该方法在load method(TestPage_Loaded)中调用,其本身在“page”(this.Loaded+=TestPage_Loaded;)的构造函数中调用,但我对datagrid之外的按钮没有任何问题!!这是无法理解的…请发布您的代码。DataGrid是否位于“页面”中?因为在加载事件时加载了控件,但没有加载模板(至少-这是不保证的)。尝试在应用程序模板()上调用:public override void;使用:public override void OnApplyTemplate();列表“ListButton”返回0项,因为它是在加载methode之前调用的!
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);
  }
}
Application.Current.Dispatcher.Invoke(() =>
 {ShortCutUtils.ImplementShortCut (this);
 }, DispatcherPriority.Render);