如何在ControlTemplate中引用控件模板

时间:2015-07-09 12:22:18

标签: c# wpf

我想从Extended WPF Toolkit设置DateTimePicker的样式,特别是Calendar控件。

<ControlTemplate  x:Key="DatePickerTemplate" TargetType="{x:Type xctk:DateTimePicker}">
           ...
    <Calendar x:Name="PART_Calendar" Template="{StaticResource CalendarTemplate}" BorderThickness="0" DisplayDate="2014-05-14"/>"
           ...
</ControlTemplate>

有什么必要,以便我可以在上面的代码中引用下面的控制模板(两者都在同一个文件中)?

<ControlTemplate x:Key="CalendarTemplate" TargetType="Calendar">
    <StackPanel x:Name="Root" HorizontalAlignment="Center">
        <CalendarItem x:Name="CalendarItem" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Template="{StaticResource CalendarItemTemplate}"/>
    </StackPanel>
</ControlTemplate>

目前VS抱怨:资源&#34; CalendarTemplate&#34;无法解决。

更新 更改定义的顺序后,首先定义<ControlTemplate x:Key="CalendarTemplate" TargetType="Calendar">... 然后使用CalendarTemplate的ControlTemplate工作,记得我的c ++,但是如果我尝试打开calendarcontrol,现在我得到以下异常:

Add value to dictionary of type 'System.Windows.ResourceDictionary' threw an exception.

2 个答案:

答案 0 :(得分:2)

你指的是一个StaticResource,所以你应该声明你的CalendarTemplate,因为它是 x:Key 而不是它的x:名称,即

<ControlTemplate x:Key="CalendarTemplate" TargetType="Calendar">
...
</ControlTemplate>

更新以显示类似的工作(注意这些在我的Xaml文件中定义在同一级别,即直接在我的主视图资源下)

<ControlTemplate x:Key="ABC123" TargetType="Button">

</ControlTemplate>

<!-- creating a control template for TextBox -->
<ControlTemplate x:Key="PasswordBoxTemplateBase" TargetType="{x:Type PasswordBox}">
    <Grid x:Name="root" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}">
        <Border x:Name="normalBorder"
                Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"/>
            <Button Template="{StaticResource ABC123}"/>
        </Border>
    </Grid>
</ControlTemplate>

答案 1 :(得分:0)

问题是在StaticResource上使用 x:Name 而不是 x:Key 。它应该是这样的( x:Key =“CalendarTemplate” ):

<ControlTemplate x:Key="CalendarTemplate" TargetType="Calendar">
</ControlTemplate>

<ControlTemplate  x:Key="DatePickerTemplate" TargetType="DatePicker">
   <Calendar x:Name="PART_Calendar" Template="{StaticResource CalendarTemplate}" BorderThickness="0"/>
</ControlTemplate>