首页 > 解决方案 > 在 WPF 用户控件中重新设置所有 DatePickerTextBox 的样式

问题描述

我有一个包含多个 DatePicker 的 UserControl;

目前,为了重新设计选择器,我必须复制相同的大量模板四次:

<UserControl.Resources>
... Unrelated ResourceDictionaries...
</UserControl.Resources>
<Grid>
   <StackPanel>
      <DatePicker x:Name="StartDate" ...various properties...>
      <DatePicker.Resources>
         <Style TargetType="{x:Type DatePickerTextBox}">
            <Setter Property="Background" Value="{StaticResource BackgroundBrush}>
            <Setter Property="Template">

    <Setter.Value>
    <ControlTemplate TargetType="DatePickerTextBox">
        ... Ridiculous amount of XML...
               <ContentControl x:Name="PART_Watermark" ...more props...>
               <ContentControl.Template>
                   <ControlTemplate>
                       <TextBlock Text="Start Date"/>  <!-- This is the crucial change I want -->
                   </ControlTemplate>
               </ContentControl.Template>
               </ContentControl>
        ...Yet more XML...
    </ControlTemplate>
    </Setter.Value>
            </Setter Property="Template">
         </Style>
      </DatePicker.Resources>
      </DatePicker>      

      <!-- Duplicate for end -->
      <DatePicker x:Name="EndDate" ...various properties...>
      <DatePicker.Resources>
         <Style TargetType="{x:Type DatePickerTextBox}">
            <Setter Property="Background" Value="{StaticResource BackgroundBrush}>
            <Setter Property="Template">

    <Setter.Value>
    <ControlTemplate TargetType="DatePickerTextBox">
        ... Ridiculous amount of XML...
               <ContentControl x:Name="PART_Watermark" ...more props...>
               <ContentControl.Template>
                   <ControlTemplate>
                       <TextBlock Text="End Date"/>  <!-- This is the crucial change I want -->
                   </ControlTemplate>
               </ContentControl.Template>
               </ContentControl>
        ...Yet more XML...
    </ControlTemplate>
    </Setter.Value>
            </Setter Property="Template">
         </Style>
      </DatePicker.Resources>
      </DatePicker>      

      <!-- Duplicate for prev start -->
      <DatePicker ...>
          ... Same massive XML as above
      </DatePicker>

      <!-- Duplicate for prev end -->
      <DatePicker ...>
          ... Same massive XML as above
      </DatePicker>

   </StackPanel>
</Grid>

我已经尝试在 UserControl.Resources 中创建一个<Style TargetType="{x:Type DatePickerTextBox}></Style>来替换它,但我无法获取它。

另外,我找不到将一段不同的文本绑定到 DatePicker 的父属性的方法。

是否可以使用相同的样式重新设置所有 4 个 DatePicker 文本框但更改了一个(深度嵌套)字符串?

标签: wpf

解决方案


您在 Datepicker.Resources 下拥有自己的风格。样式总是由他们父母的资源而不是他们自己的资源来挑选的。将该样式放在层次结构中的其他位置。例如,Grid.Resources。


推荐阅读