Как узнать, что CalendarViewDayItem находится вне области действия CalendarView? - PullRequest
0 голосов
/ 16 мая 2019

Чтобы сделать некоторые стили в элементах дня CalendarView, мне нужно знать, находится ли CalendarViewDayItem (date) в области текущего месяца CalendarView или нет. Есть ли способ узнать текущий месяц / год?

Это то, что я получил до сих пор: стилизованный CalendarView и CalendarViewDayItem для отображения в календаре некоторой визуальной информации, несмотря на номер дня. Все элементы CalendarViewDayItems за октябрь (30 сентября и даты ноября) должны быть затенены / понижены контрастности. Номер дня даты затенен (значения стиля 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"
                          />

И, наконец, код c #, который изменяет внешний вид CalendarViewDayItem:

 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 голосов
/ 17 мая 2019

Мне нужно знать, находится ли CalendarViewDayItem (date) в области текущего месяца 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;
}
...