我正在使用每个月的单独日历控件创建一个 12 个月的日历。由于我通过单独的明年和上一年按钮控制日历(1 月 - 12 月),因此我想从各个日历中删除上一个和下一个日历项按钮并禁用更改显示模式的功能。
由于我是 XAML 新手并且更喜欢在代码中执行此操作,因此我更愿意在运行时更改样式,但愿意学习如何通过 XAML 实现它,但我很难找到某人正在做某事的示例像这样。
希望有人可以提供帮助。
我正在使用每个月的单独日历控件创建一个 12 个月的日历。由于我通过单独的明年和上一年按钮控制日历(1 月 - 12 月),因此我想从各个日历中删除上一个和下一个日历项按钮并禁用更改显示模式的功能。
由于我是 XAML 新手并且更喜欢在代码中执行此操作,因此我更愿意在运行时更改样式,但愿意学习如何通过 XAML 实现它,但我很难找到某人正在做某事的示例像这样。
希望有人可以提供帮助。
我建议您参考这篇文章,以对日历控件有一些基本的了解。
简而言之,您需要修改 CalendarItemStyle 并从其模板中删除 PART_PreviousButton 和 PART_NextButton。您可以在此处找到日历控件所有部分的默认模板。
当您创建没有这些部分的新日历项样式时,请将其设置为XAML 中日历的CalendarItemStyle属性。
好吧,经过大量的挖掘,许多例子和 Dodsky 为我指明了正确的方向。我想通了,觉得分享是回报开发者社区的最好方式。因为,我是 XAML 的新手,所以我在项目战中取得了小小的胜利。希望它能帮助像我这样的其他新手。
我将尝试解释我可以向您展示如何以任何您需要的方式操作日历的最佳方式。
在我的用户控件中
<Calendar CalendarItemStyle="{DynamicResource calItemStyle}" Name="calJan"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
HorizontalAlignment="Center" VerticalAlignment="Center" OverridesDefaultStyle="False"
IsEnabled="True" />
有些参数有点矫枉过正,重点是Dynamic Resource
CalendarItemStyle="{DynamicResource calItemStyle}"
在我的 ResourceDictionary 中,我添加了命名空间
xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework"
您还需要将 PresentationFramework 引用添加到您的项目中,如果它不存在的话。
<Style x:Key="calItemStyle"
TargetType="primitives:CalendarItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="primitives:CalendarItem">
<ControlTemplate.Resources>
<DataTemplate x:Key="DayTitleTemplate">
<TextBlock Text="{Binding}"
HorizontalAlignment="Center" />
</DataTemplate>
</ControlTemplate.Resources>
<DockPanel Name="PART_Root"
LastChildFill="True">
<Button x:Name="PART_PreviousButton"
DockPanel.Dock="Left"
Content="<"
Focusable="False"
Visibility="Hidden"
/>
<Button x:Name="PART_NextButton"
DockPanel.Dock="Right"
Content=">"
Focusable="False"
Visibility="Hidden"
/>
<Button x:Name="PART_HeaderButton"
DockPanel.Dock="Top"
FontWeight="Bold"
Focusable="False" />
<Grid>
<Grid x:Name="PART_MonthView"
Visibility="Visible">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
</Grid>
<Grid x:Name="PART_YearView"
Visibility="Hidden">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
</Grid>
</Grid>
<Rectangle x:Name="PART_DisabledVisual" Opacity="0" Visibility="Collapsed" Fill="#A5FFFFFF"/>
</DockPanel>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="PART_DisabledVisual" Property="Visibility" Value="Visible" />
</Trigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Calendar}}, Path=DisplayMode}" Value="Year">
<Setter TargetName="PART_MonthView" Property="Visibility" Value="Hidden" />
<Setter TargetName="PART_YearView" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Calendar}}, Path=DisplayMode}" Value="Decade">
<Setter TargetName="PART_MonthView" Property="Visibility" Value="Hidden" />
<Setter TargetName="PART_YearView" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我选择隐藏“上一个”和“下一个”按钮,以防万一删除导致任何事件出现问题,但除此之外,它会执行我想要的操作,并且我可以根据需要添加或删除功能。
希望这对其他人有帮助。
和 Chris 一样,我不想乱用一大堆 XAML。我还需要动态隐藏/显示。我想有一种方法可以通过 XAML 中的绑定来做到这一点,但我认为这是一个非常简单的开始。只需使用此代码添加一个新类,然后改用此派生控件即可。
编辑:我将其更新为具有您可以设置的属性 HidePrevNextBtns。如果选中/为真,按钮将被隐藏。这段代码确实做了几个假设。一个是模板也将具有上一个/下一个按钮,另一个是默认情况下它们是可见的。
class MyCalendar : Calendar
{
public Button PrevBtn;
public Button NextBtn;
protected bool _HidePrevNextBtns;
public bool HidePrevNextBtns
{
get
{
return (_HidePrevNextBtns);
}
set
{
_HidePrevNextBtns = value;
if (PrevBtn != null)
{
PrevBtn.Visibility = _HidePrevNextBtns ? Visibility.Hidden : Visibility.Visible;
NextBtn.Visibility = _HidePrevNextBtns ? Visibility.Hidden : Visibility.Visible;
}
}
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var cal = this.Template.FindName("PART_CalendarItem", this) as CalendarItem;
cal.Loaded += new RoutedEventHandler(cal_Loaded);
}
void cal_Loaded(object sender, RoutedEventArgs e)
{
var cal = sender as CalendarItem;
PrevBtn = cal.Template.FindName("PART_PreviousButton", cal) as Button;
NextBtn = cal.Template.FindName("PART_NextButton", cal) as Button;
if (_HidePrevNextBtns)
{
PrevBtn.Visibility = Visibility.Hidden;
NextBtn.Visibility = Visibility.Hidden;
}
}
}