首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VisualTreeHelper在DataGridTemplateColumn.CellTemplate中找不到控制

VisualTreeHelper在DataGridTemplateColumn.CellTemplate中找不到控制
EN

Stack Overflow用户
提问于 2017-06-29 09:56:06
回答 2查看 630关注 0票数 0

我使用此方法列出用户控件的所有按钮:

代码语言:javascript
复制
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内的按钮外,它工作得很好

代码语言:javascript
复制
<DataGridTemplateColumn>                    
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <StackPanel>
            <Button x:Name="Btn_Edit"
                    Click="Btn_EditTest_Click"/>
        </StackPanel>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

'VisualTreeHelper.GetChild‘似乎无法在数据项中找到控件。

EN

回答 2

Stack Overflow用户

发布于 2017-06-29 10:48:06

我的课

代码语言:javascript
复制
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

代码语言:javascript
复制
            <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码

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-07-01 08:23:29

按照假定的'ShortCutUtils.ImplementShortCut swiszcz,在“Load”结束时调用 (this)‘方法时未完成所有控件的加载。为此,我将此方法放置在低优先级的“调用”中。

代码语言:javascript
复制
Application.Current.Dispatcher.Invoke(() =>
 {ShortCutUtils.ImplementShortCut (this);
 }, DispatcherPriority.Render);

而且效果很好!非常感谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44821912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档