我使用此方法列出用户控件的所有按钮:
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‘似乎无法在数据项中找到控件。
发布于 2017-06-29 10:48:06
我的课
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);
}
}发布于 2017-07-01 08:23:29
按照假定的'ShortCutUtils.ImplementShortCut swiszcz,在“Load”结束时调用 (this)‘方法时未完成所有控件的加载。为此,我将此方法放置在低优先级的“调用”中。
Application.Current.Dispatcher.Invoke(() =>
{ShortCutUtils.ImplementShortCut (this);
}, DispatcherPriority.Render);而且效果很好!非常感谢
https://stackoverflow.com/questions/44821912
复制相似问题