C# 使用样式将日历的宽度更改为其父日期选择器的宽度
我有一个用于DatePicker的WPF样式,其中DatePicker的日历也是样式化的。请看下面的内容: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
<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}不起作用,我想你误解了绑定在模板内的工作方式