如何知道CalendarViewDayItem不在CalendarView月范围内?

时间:2019-05-16 17:56:22

标签: c# uwp-xaml calendarview

要对CalendarView日元素进行一些样式设置,我需要知道CalendarViewDayItem(日期)是否在当前CalendarView月的范围内。有什么方法可以获取当前的月份/年份?

到目前为止,这是我得到的:样式化的CalendarView和CalendarViewDayItem可以在日历中显示一些视觉信息,尽管只有天数。十月(9月30日和十一月的日期)之后的所有CalendarViewDayItems均应加阴影/降低对比度。日期的天数带有阴影(CalendarView OutOfSCope样式值),但不带有CalendarViewDayItem元素。

enter image description here

在这里设置样式的CalendarViewDayItem代码:

<Style TargetType="CalendarViewDayItem" >
            <Setter Property="MinWidth"         Value="40"/>
            <Setter Property="MinHeight"        Value="40"/>
            <Setter Property="Margin"           Value="0"/>
            <Setter Property="BorderThickness"  Value="2"/>
            <Setter Property="Padding"          Value="0, 0, 0, 4"/>
            <Setter Property="FontSize"         Value="10"/>
            <Setter Property="FontWeight"       Value="SemiBold"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="CalendarViewDayItem">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>

                            <!--Header phase?-->
                            <Grid x:Name="DayItemHeader" Grid.Row="0" Margin="0,25,0,0">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <!--<TextBlock x:Name="DayItemDateNumber" Grid.Column="0" Text="a"/>-->
                                <TextBlock x:Name="DayItemPhase" Grid.Column="1" Text="Phase"/>
                            </Grid>

                            <Grid x:Name="DayItemBody" Grid.Row="1" Background="Transparent">
                                <Image Height="30" Width="30" Margin="0" Source="{Binding Icon}" Stretch="UniformToFill" />

                                <StackPanel>
                                    <Image Height="30" Width="30" Margin="0" Source="{Binding Icon}" Stretch="UniformToFill" />
                                    <TextBlock x:Name="tbSomeText" Text="Some text"/>
                                </StackPanel>

                            </Grid>

                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>




  <CalendarView x:Name="calviewDatePicker" 
                          HorizontalAlignment="Center" VerticalAlignment="Center" 
                          Height="600" Width="600"

                            SelectionMode="Single" IsGroupLabelVisible="True"
                            IsOutOfScopeEnabled="True" Language="en-US"
                            CalendarIdentifier="GregorianCalendar"

                            OutOfScopeBackground="{StaticResource VeryDarkGreyThemeColor}" OutOfScopeForeground="{ThemeResource MediumGreyThemeColor}" 
                            CalendarItemBackground="{ThemeResource VeryDarkGreyThemeColor}" CalendarItemForeground="{ThemeResource VeryLightGreyThemeColor}"
                            SelectedBorderBrush="{ThemeResource PrimaryThemeColor}" SelectedPressedBorderBrush="{x:Null}" SelectedHoverBorderBrush="{ThemeResource PrimaryThemeColor}"  
                            BorderBrush="{x:Null}" Background="{ThemeResource VeryDarkGreyThemeColor}" 
                            FirstDayOfWeek="Monday" NumberOfWeeksInView="6" Style="{StaticResource CalendarViewStyle1}" DayOfWeekFormat="{}{dayofweek.solo.abbreviated(3)}"

                          FirstOfMonthLabelFontWeight="ExtraBlack"
                          VerticalFirstOfMonthLabelAlignment="Top" HorizontalFirstOfMonthLabelAlignment="Left"
                          VerticalDayItemAlignment="Top" HorizontalDayItemAlignment="Right" 

                          CalendarViewDayItemChanging="calviewSun_CalendarViewDayItemChanging"
                          />

最后,更改CalendarViewDayItem外观的C#代码:

 private void calviewSun_CalendarViewDayItemChanging(CalendarView sender, CalendarViewDayItemChangingEventArgs args)
    {

        // Render basic day items.
        if (args.Phase == 0)
        {
            // Register callback for next phase.

            // Every date before today is grayed
            if (args.Item.Date < DateTimeOffset.Now.AddDays(-1))
            {
                args.Item.Opacity = 0.5;
            }
            else
            {
                args.Item.Opacity = 1.0;
            }

            args.RegisterUpdateCallback(calviewSun_CalendarViewDayItemChanging);

        }

    }

我没有包含CalendarView代码,因为它太长了,我认为这对问题不是很有趣。

1 个答案:

答案 0 :(得分:0)

  

我需要知道CalendarViewDayItem(日期)是否在当前CalendarView月的范围内。有什么方法可以获取当前的月份/年份?

您可以处理SelectedDatesChanged事件,并从args获取选择日期。并且参数包含当前的月份/年份。

MyCalendarView.SelectedDatesChanged += MyCalendarView_SelectedDatesChanged;

private void MyCalendarView_SelectedDatesChanged(CalendarView sender, CalendarViewSelectedDatesChangedEventArgs args)
{
    MyTextBox.Text = args.AddedDates.First().ToString();
}

enter image description here

更新 请尝试使用CalendarViewDayItemChanging处理程序获取日期,如下所示。

private void CalendarView_CalendarViewDayItemChanging(CalendarView sender, CalendarViewDayItemChangingEventArgs args)
{
    var item = args.Item;
    var date = item.Date;
}