【问题标题】:is it possible to set the height of density Bar inc UWP CalendarView是否可以设置密度 Bar inc UWP CalendarView 的高度
【发布时间】:2018-06-20 14:58:50
【问题描述】:

我想知道,是否可以在 UWP CalendarView 控件中设置密度条的高度?

亲切的问候,

马丁

【问题讨论】:

    标签: uwp


    【解决方案1】:

    CalendarView 控件的日历网格由CalendarViewDayItem 对象组成。我们可以使用CalendarViewDayItemChangingEventArgsItem 属性来修改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>
    

    【讨论】:

      猜你喜欢
      • 2016-01-28
      • 1970-01-01
      • 2021-08-11
      • 2021-11-18
      • 2012-10-19
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      相关资源
      最近更新 更多