C# 使用样式将日历的宽度更改为其父日期选择器的宽度

C# 使用样式将日历的宽度更改为其父日期选择器的宽度,c#,wpf,xaml,C#,Wpf,Xaml,我有一个用于DatePicker的WPF样式,其中DatePicker的日历也是样式化的。请看下面的内容: <Style TargetType="{x:Type DatePicker}" x:Key="datePickerGeneralStyle" BasedOn="{StaticResource {x:Type DatePicker}}"> <Setter Property="TextElement.FontSize" Value="{StaticResource 2

我有一个用于DatePicker的WPF样式,其中DatePicker的日历也是样式化的。请看下面的内容:

<Style TargetType="{x:Type DatePicker}" x:Key="datePickerGeneralStyle" BasedOn="{StaticResource {x:Type DatePicker}}">
    <Setter Property="TextElement.FontSize" Value="{StaticResource 24}" />
    <Setter Property="VerticalAlignment" Value="{StaticResource Center}" />
    <Setter Property="VerticalContentAlignment" Value="{StaticResource Center}" />
    <Setter Property="DatePicker.CalendarStyle">
        <Setter.Value>
            <Style TargetType="{x:Type Calendar}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Calendar}">
                            <Viewbox Height="{Binding DatePicker.Width}" Width="{Binding DatePicker.Width}">
                                <CalendarItem x:Name="PART_CalendarItem"
                              Background="{TemplateBinding Background}"
                              BorderBrush="{TemplateBinding BorderBrush}"
                              BorderThickness="{TemplateBinding BorderThickness}"/>
                            </Viewbox>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

现在查看上面代码中的下一行:

<Viewbox Height="{Binding DatePicker.Width}" Width="{Binding DatePicker.Width}">


现在我想让这种风格更通用。因此,当我声明一个DatePicker并将其style属性设置为datePickerGeneralStyle时,DatePicker的日历的宽度应该与DatePicker的宽度相同。即使没有提到日期选择器的宽度,我也希望有这种行为。我的意思是,日期选择器应该使用容器中的可用空间或我们称之为“自动宽度”。

尝试了解标准日期选择器和日历模板,因为这可能会让您了解如何实现所需的结果


尝试了解标准日期选择器和日历模板,因为这可能会让您了解如何实现所需的结果


您可以通过使用绑定集RelativeSource来绑定父控件(在本例中为DatePicker)的属性

这是一份关于不同绑定类型和模式的精彩备忘:

注意:我已将绑定设置为实际宽度,因为日期选择器上可能未设置宽度,但它始终具有实际宽度

我还修改了您设置字体大小、垂直对齐方式等的方式,因为它似乎过于复杂

 <Style TargetType="{x:Type DatePicker}" x:Key="datePickerGeneralStyle" BasedOn="{StaticResource {x:Type DatePicker}}">
            <Setter Property="TextElement.FontSize" Value="24" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="VerticalContentAlignment" Value="Center" />
            <Setter Property="DatePicker.CalendarStyle">
                <Setter.Value>
                    <Style TargetType="{x:Type Calendar}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type Calendar}">
                                    <Viewbox Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DatePicker}}}">
                                        <CalendarItem x:Name="PART_CalendarItem"
                              Background="{TemplateBinding Background}"
                              BorderBrush="{TemplateBinding BorderBrush}"
                              BorderThickness="{TemplateBinding BorderThickness}"/>
                                    </Viewbox>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>

您可以使用一个到RelativeSource的绑定集来绑定父控件(在本例中是DatePicker)的属性

这是一份关于不同绑定类型和模式的精彩备忘:

注意:我已将绑定设置为实际宽度,因为日期选择器上可能未设置宽度,但它始终具有实际宽度

我还修改了您设置字体大小、垂直对齐方式等的方式,因为它似乎过于复杂

 <Style TargetType="{x:Type DatePicker}" x:Key="datePickerGeneralStyle" BasedOn="{StaticResource {x:Type DatePicker}}">
            <Setter Property="TextElement.FontSize" Value="24" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="VerticalContentAlignment" Value="Center" />
            <Setter Property="DatePicker.CalendarStyle">
                <Setter.Value>
                    <Style TargetType="{x:Type Calendar}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type Calendar}">
                                    <Viewbox Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DatePicker}}}">
                                        <CalendarItem x:Name="PART_CalendarItem"
                              Background="{TemplateBinding Background}"
                              BorderBrush="{TemplateBinding BorderBrush}"
                              BorderThickness="{TemplateBinding BorderThickness}"/>
                                    </Viewbox>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>


这个{Binding DatePicker.Width}不起作用,我想你误解了绑定在模板内的工作方式。这个{Binding DatePicker.Width}不起作用,我想你误解了绑定在模板内的工作方式