WPF自定义日历没有上一页和下一页按钮,没有displaymode选项

时间:2012-10-26 12:22:46

标签: c# wpf button calendar disabled-control

我使用每个月的个别日历控件创建一个12个月的日历。由于我通过单独的明年和前一年按钮控制日历(1月 - 12月),我想从各个日历中删除上一个和下一个calendaritem按钮,并禁用更改显示模式的功能。

由于我是XAML的新手,并且更喜欢在代码中执行此操作,我更愿意在运行时更改样式,但愿意学习如何通过XAML实现它,但我很难找到一个示例有人这样做。

希望有人可以提供帮助。

3 个答案:

答案 0 :(得分:1)

我会向您推荐this文章,以便对Calendar控件有一些基本的了解。

简而言之,您需要修改CalendarItemStyle并从其模板中删除PART_PreviousButton和PART_NextButton。您可以找到Calendar控件here的所有部分的默认模板。

当您创建没有这些部分的新日历项目样式时,请在XAML中将其设置为日历的CalendarItemStyle属性。

答案 1 :(得分:1)

好吧,经过大量的挖掘,很多例子和Dodsky都指出了我正确的方向。我想通了,并认为共享是回报开发者社区的最佳方式。因为,我是XAML的新手,这是我所参与的项目战中的小胜利。希望它能帮助像我这样的其他新手。

我将尝试解释我能以最佳方式向您展示如何以任何方式操纵日历。

在我的UserControl中

<Calendar CalendarItemStyle="{DynamicResource calItemStyle}"  Name="calJan"    
 HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" 
 HorizontalAlignment="Center" VerticalAlignment="Center" OverridesDefaultStyle="False" 
 IsEnabled="True" />

有些参数过度,主要是动态资源

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="&lt;"
                                Focusable="False" 
                                Visibility="Hidden"
                                />

                    <Button x:Name="PART_NextButton" 
                                DockPanel.Dock="Right"
                                Content="&gt;" 
                                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>

我选择隐藏“上一页”和“下一页”按钮,以防万一删除导致任何事件出现问题,但除此之外,它会按照我的意愿执行,我可以根据需要添加或删除功能。

希望这有助于其他人。

答案 2 :(得分:0)

像克里斯一样,我不想搞砸XAML。我还需要动态隐藏/显示。我想有一种方法可以用XAML中的绑定来做到这一点,但我认为这是一个非常简单的开始。只需使用此代码添加一个新类,然后使用此派生控件。

编辑:我更新了它以拥有一个你可以设置的属性,HidePrevNextBtns。如果选中/是,则隐藏按钮。这段代码确实做了几个假设。一个是模板也有prev / next按钮,另一个是默认情况下它们可见。

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;
        }
    }
}