C# VisualTreeHelper不';在DataGridTemplateColumn.CellTemplate中找不到控件
我使用此方法列出usercontrol的所有按钮: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
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);