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