1

日付ピッカーコントロールにインジケーターを追加しようとしています(TextBlockを使用しています)。

視覚的には機能しますが、GetTemplateChildを介してコントロールを取得できません。追加したTextBlockコントロールがDatePickerスタイルテンプレートではなくDatePickerTextBoxスタイルテンプレートにあるという事実と関係があると思います。

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 に答える