1

我正在尝试向 datepicker 控件添加一个指示器(我正在使用 TextBlock)。

视觉上它可以工作,但我无法通过 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}" />
4

1 回答 1

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 子项,因为我正在访问我的 [控件] 模板。我不能使用 GetTemplateChild 从另一个使用 MyCustomControl 的控件中获取 TextBox。只有 MyCustomControl 可以使用 GetTemplateChild 来获取 TextBox。

现在我可以扩展 MyCustomControl 来做同样的事情

public class MyOtherCustomControl : MyCustomControl
{
    override OnApplyTemplate()
    {
        var textbox = GetTemplateChild("TextBox");
    }
}

我希望这有帮助!

于 2012-07-01T15:17:03.170 回答