2

我正在构建一个继承自标准 System.Windows.Controls.Calendar 控件的自定义控件。我正在关注关于代码项目的这篇文章。我还想让 CalendarItem 子对象可调整大小,如 MSDN 上的这篇文章中所述。

我将 Calendar、CalendarDayButton 和 CalendarItem 的样式从 Calendar 控件的源代码复制到位于我的 Generic.xaml 中的自定义控件 ResourceDictionary 中。CalendarItem 样式引用了 3 个按钮模板(上个月、下个月和标题按钮),如下所示:

<!-- Start: Previous button content -->
<Button x:Name="PART_PreviousButton" 
        Grid.Row="0" Grid.Column="0"
        Template="{StaticResource PreviousButtonTemplate}" 
        Height="20" Width="28" 
        HorizontalAlignment="Left" 
        Focusable="False"
        />
<!-- End: Previous button content -->

<!-- Start: Header button content -->
<Button x:Name="PART_HeaderButton"                                             
        Grid.Row="0" Grid.Column="1" 
        Template="{StaticResource HeaderButtonTemplate}" 
        HorizontalAlignment="Center" VerticalAlignment="Center" 
        FontWeight="Bold" FontSize="10.5" 
        Focusable="False"
        />
<!-- End: Header button content -->

<!-- Start: Next button content -->
<Button x:Name="PART_NextButton" 
        Grid.Row="0" Grid.Column="2" 
        Height="20" Width="28" 
        HorizontalAlignment="Right" 
        Template="{StaticResource NextButtonTemplate}" 
        Focusable="False"
        />
<!-- End: Next button content -->

现在因为这个绑定使用了一个 StaticResource,我需要将三个按钮的样式复制到我的 ResourceDictionary 中。我不打算对这些按钮进行任何更改,因此我希望可以避免在我的 ResourceDictionary 中为它们设置样式。

有什么方法可以通过绑定引用这些按钮的原始样式?

4

1 回答 1

1

就在这里:

在继承自的自定义控件上,您可以为三种样式中的每一种Calendar公开类型的依赖属性ControlTemplate

public class MyCalender : Calendar
{
    public static readonly DependencyProperty PreviousButtonTemplateProperty =
        DependencyProperty.Register("PreviousButtonTemplate", typeof (ControlTemplate), typeof (MyCalender), new PropertyMetadata(default(ControlTemplate)));

    public ControlTemplate PreviousButtonTemplate
    {
        get { return (ControlTemplate) GetValue(PreviousButtonTemplateProperty); }
        set { SetValue(PreviousButtonTemplateProperty, value); }
    }

    // Same for other button templates
}

并使用绑定从您ControlTemplate的日历中绑定到这些样式TemplatedParent

<ControlTemplate x:Key="MyCalender" TargetType="viewModels:MyCalendar">
    <Grid>
        <Button x:Name="PART_PreviousButton" 
        Grid.Row="0" Grid.Column="0"
        Template="{TemplateBinding  Property=PreviousButtonTemplate}" 
        Height="20" Width="28" 
        HorizontalAlignment="Left" 
        Focusable="False"
        />
    </Grid>
</ControlTemplate>

然后,我将在可能的最高级别上定义一个默认样式,它将按钮模板(PreviousButtonTemplate等)分配给自定义日历控件的依赖属性。最高级别是指对象,所有模板都存在于其范围内,您将它们连接在一起,例如app.xaml或您的窗口。

<Style TargetType="viewModels:MyCalendar">
    <Setter Property="PreviousButtonTemplate" Value="{StaticResource PreviousButtonTemplate}" />
</Style>

或者,您可以保持原样,只要StaticResources在运行时控制模板引用的 存在,它们就会被正确解析。不好,但没有设计时支持。

编辑

好的,我没有明白您指的是“原始”按钮模板,我以为您的意思是您已经在其他地方定义的模板。然后:不,你不能这样做。我已经多次尝试同样的事情,但是您不能创建使用原始模板的一部分的控制模板。ControlTemplate 没有“BasedOn”之类的东西。

于 2013-05-21T10:24:58.943 回答