我有一个带有以下DataGrid的wpf c#customControl。 我想在DataTemplate中获取Border,因为我可以使用DataGrid和DataGridTemplateColumn
public override void OnApplyTemplate()
{
var dataGrid = GetTemplateChild("PART_DataGrid") as DataGrid;
var tempColumn = GetTemplateChild("PART_TempColumn") as DataGridTemplateColumn;
}
为什么
var timerPointer = GetTemplateChild("PART_Border") as Border;
不起作用(总是为空),我如何获得边框?
<DataGrid x:Name="PART_DataGrid" >
<DataGrid.Columns>
<DataGridTemplateColumn x:Name="PART_TempColumn" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border x:Name="PART_Border" >
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
答案 0 :(得分:0)
它无法工作的原因是因为您在ControlTemplate范围内搜索,但该元素是在DataTemplate范围内定义的。
以下是如何使其运行的示例。
这就像你拥有的ControlTemplate一样。
<Style TargetType="{x:Type local:CustomControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<StackPanel>
<Button x:Name="bttn">
<Button.ContentTemplate>
<DataTemplate>
<TextBlock x:Name="txtBlock" Text="{Binding}"/>
</DataTemplate>
</Button.ContentTemplate>
click me
</Button>
</StackPanel>
</Border>
</ControlTemplate>
这是OnApplyTemplate方法。
public override void OnApplyTemplate()
{
Dispatcher.BeginInvoke(
DispatcherPriority.Loaded,
new Action(
() =>
{
var button = this.GetTemplateChild("bttn") as Button;
for (DependencyObject child = VisualTreeHelper.GetChild(button, 0);
child != null;)
{
if (child is ContentPresenter)
{
var parent = (ContentPresenter)child;
var element = parent.ContentTemplate.FindName("txtBlock", parent) as TextBlock;
if (element != null)
{
Console.WriteLine("Found it!");
break;
}
}
if (VisualTreeHelper.GetChildrenCount(child) > 0)
{
child = VisualTreeHelper.GetChild(child, 0);
}
}
}));
base.OnApplyTemplate();
}
如您所见,您首先需要找到合适的范围,然后您可以搜索该元素的名称。