我正在尝试将一个指示符(我正在使用TextBlock)添加到datepicker控件。
视觉上可行,但我无法通过GetTemplateChild获得控件。我假设这与我添加的TextBlock控件是在DatePickerTextBox样式模板而不是DatePicker样式模板这一事实有关。
我已经尝试过DefaultStyleKey(虽然我认为这没有意义,因为它是DatePicker中的TextBox控件是问题)并且在TextBox控件上使用OnApplyTemplate和UpdateLayout。
这是Dictionary.xaml的片段
<Style x:Key="Ind_DatePickerTextBoxStyle" TargetType="primitives:DatePickerTextBox">
...
<Grid VerticalAlignment="Stretch">
<TextBlock x:Name="Indicator" Text="*" Style="{StaticResource IndicatorStyle}" Visibility="Collapsed"/>
...
<!--datepicker style snippet-->
<primitives:BF_DatePickerTextBox
x:Name="TextBox"
SelectionBackground="{TemplateBinding SelectionBackground}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
Grid.Column="0"
Style="{StaticResource Ind_DatePickerTextBoxStyle}" />
答案 0 :(得分:0)
GetTemplateChild只能在“您的控件”中使用,以获取在其[控件]模板中定义的控件。定义控件并为其指定样式后,可以使用GetTemplateChild
public class MyCustomControl : Control
{
override OnApplyTemplate()
{
var textbox = GetTemplateChild("TextBox");
}
}
<Style TargetType="local:MyCustomControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:MyCustomControl">
<TextBox x:Name="TextBox"/>
</ControlTemplate>
</Setter.Value>
</Setter>
所以在这个例子中我能够使用GetTemplateChild来获取控件中的TextBox子元素,因为我正在访问我的[control]模板。我不能使用GetTemplateChild从另一个使用MyCustomControl的控件获取TextBox。只有MyCustomControl可以使用GetTemplateChild来获取TextBox。
现在我可以扩展MyCustomControl以执行相同的操作
public class MyOtherCustomControl : MyCustomControl
{
override OnApplyTemplate()
{
var textbox = GetTemplateChild("TextBox");
}
}
我希望这有帮助!