-1

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

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 ”似乎无法在数据网格项中找到控件。

4

2 回答 2

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

测试页 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>

测试页代码

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);
  }
}
于 2017-06-29T10:48:06.210 回答
0

假设swiszcz ,在“ Load ”末尾调用“ ShortCutUtils.ImplementShortCut (this) ”方法时,所有控件都没有完成加载。为了解决这个问题,我因此将此方法置于低优先级“调用”中

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

它工作正常!太感谢了

于 2017-07-01T08:23:29.933 回答