【发布时间】:2018-06-20 14:58:50
【问题描述】:
我想知道,是否可以在 UWP CalendarView 控件中设置密度条的高度?
亲切的问候,
马丁
【问题讨论】:
标签: uwp
我想知道,是否可以在 UWP CalendarView 控件中设置密度条的高度?
亲切的问候,
马丁
【问题讨论】:
标签: uwp
CalendarView 控件的日历网格由CalendarViewDayItem 对象组成。我们可以使用CalendarViewDayItemChangingEventArgs 的Item 属性来修改CalendarView 控件的CalendarViewDayItemChanging 事件中的日期项,以访问CalendarViewDayItem 对象。 密度条位于CalendarViewDayItem。
但为了提高性能,CalendarViewDayItem 的可视元素由控件直接呈现,而不是在控件模板中定义为 XAML 元素。这意味着我们不能对这些元素进行样式化或重新模板化。尽管我们可以使用多个“日历项”和“日项”属性来自定义这些元素,但它们没有设置密度条高度的属性。所以我们不能通过修改样式来改变density Bar的高度。
因此,根据您的要求,我们可以做一些替代解决方法。
如果你只是觉得一个密度条没有很好的标记,你可以提供两个或更多的带有颜色的密度条,让它更明显。
private void CalendarView_CalendarViewDayItemChanging(CalendarView sender, CalendarViewDayItemChangingEventArgs args)
{
List<Color> densityColors = new List<Color>();
densityColors.Add(Colors.Green);
densityColors.Add(Colors.Green);
args.Item.SetDensityColors(densityColors);
}
另一种方法会更复杂。因为默认样式(参见CalendarViewDayItem 样式和模板)还包括一个空的ControlTemplate,您可以使用它来将自定义XAML 元素注入CalendarViewDayItem。您的 XAML 元素呈现在背景元素之上,日期数字和标签之下。所以你可以自定义一个CalendarView并改变CalendarViewDayItem的样式来添加一个“密度条”,同时你应该暴露一个属性来控制“密度条”是否可见。
这里是给CalendarViewDayItem添加“密度条”的示例样式,你可以把它放在页面的资源中看看效果。
<Page.Resources>
<!-- Default style for CalendarViewDayItem -->
<Style TargetType="CalendarViewDayItem">
<Setter Property="MinWidth" Value="40" />
<Setter Property="MinHeight" Value="40" />
<Setter Property="Margin" Value="1" />
<Setter Property="Padding" Value="0, 0, 0,0" />
<Setter Property="UseSystemFocusVisuals" Value="{StaticResource UseSystemFocusVisuals}" />
<Setter Property="FocusVisualMargin" Value="-2" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CalendarViewDayItem">
<!-- For CalendarViewDayItem, TextBlock visual is created and handled by code and we can't see it from the style. -->
<!-- CCalendarViewBaseItemChrome creates and appends a TextBlock in the visual after the ControlTemplate is applied -->
<!-- VSM needs a container and that's why Grid is added. But we don't need the rendering of Grid so We set width to 0 -->
<Grid x:Name="Root" Width="40" Height="8" Background="Red" VerticalAlignment="Bottom">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="PointerOver">
<VisualState.Setters>
<Setter Target="Root.(RevealBrush.State)" Value="PointerOver" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Pressed">
<VisualState.Setters>
<Setter Target="Root.(RevealBrush.State)" Value="Pressed" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
【讨论】: