1

各月の個々のカレンダー コントロールを使用して、12 か月のカレンダーを作成しています。翌年と前年のボタンを別々に使用してカレンダー (1 月 - 12 月) を制御しているため、個々のカレンダーから前と次のカレンダー項目ボタンを削除し、表示モードを変更する機能を無効にします。

私は XAML を初めて使用し、コードでこれを行うことに慣れているので、実行時にスタイルを変更したいと思いますが、XAML を介してそれを実現する方法を学びたいと思っていますが、誰かが何かをしている例を見つけるのに非常に苦労していますこのような。

誰かが助けてくれることを願っています。

4

3 に答える 3

1

カレンダーコントロールの基本的な理解を得るために、この記事を参照してください。

つまり、CalendarItemStyleを変更し、そのテンプレートからPART_PreviousButtonとPART_NextButtonを削除する必要があります。カレンダーコントロールのすべての部分のデフォルトテンプレートはここにあります。

これらの部分を使用せずに新しいカレンダーアイテムスタイルを作成する場合は、XAMLでカレンダーのCalendarItemStyleプロパティに設定します。

于 2012-10-26T13:14:12.807 に答える
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>

削除によってイベントに問題が発生した場合に備えて、[前へ] ボタンと [次へ] ボタンを非表示にすることにしましたが、それ以外の場合は、必要に応じて機能を追加または削除できます。

これが他の人に役立つことを願っています。

于 2012-10-27T14:42:55.877 に答える
0

Chris のように、私は大量の XAML をいじりたくありませんでした。また、動的に非表示/表示する必要がありました。XAML のバインドでもこれを行う方法があると思いますが、これは非常に簡単な出発点だと思いました。このコードで新しいクラスを追加するだけで、代わりにこの派生コントロールを使用できます。

編集: HidePrevNextBtns というプロパティを設定できるように更新しました。チェック/真の場合、ボタンは非表示になります。このコードはいくつかの仮定をしています。1 つは、テンプレートにも前/次のボタンがあり、もう 1 つはデフォルトで表示されることです。

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;
        }
    }
}
于 2013-08-30T16:40:22.340 に答える