控件内的Silverlight GetTemplateChild返回null

时间:2012-06-29 16:08:08

标签: silverlight templates datepicker

我正在尝试将一个指示符(我正在使用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}" />

1 个答案:

答案 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");
    }
}

我希望这有帮助!