Как создать упорядоченное многимесячное индексное представление WPF? - PullRequest
0 голосов
/ 15 февраля 2011

Можно ли объявить (связанный) многомесячный календарь Index View Control в чистом Xaml?Независимо от открытого интерфейса результирующего элемента управления.

То, что я намереваюсь получить, будет выглядеть так (ну, вроде как):

<..>1234556 1234567878910 .. 91011 ...

Над вами два календаря.Если один из этих календарей переключается вперед или назад на один месяц, «соседи» также должны переключать состояние в этом направлении.Кроме того, количество видимых календарей должно определяться текущей шириной и высотой элемента управления.

Сначала я подумал о WrapPanel.Но то, что я пытаюсь выяснить, - это как указать источник элементов (список DateTime's) и «связь» между календарями.

Есть предложения о том, как решить эту проблему наилучшим образом в WPF?

1 Ответ

1 голос
/ 16 февраля 2011

Вы можете связать календари, привязав значение DisplayDate к смежному элементу управления Calendar и используя преобразователь значений для настройки месяца. Я включил базовый прототип, чтобы вы начали.

Вот XAML:

<Window x:Class="CalendarTriggers.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Converter="clr-namespace:CalendarTriggers" 
    Title="MainWindow" 
    Height="350" Width="525">
  <Window.Resources>
    <Converter:CalendarConverter x:Key="conv"/>
  </Window.Resources>
  <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Calendar x:Name="Month1" Grid.Column="0" DisplayDate="2011/01/11" />
    <Calendar x:Name="Month2" Grid.Column="1" DisplayDate="{Binding Path=DisplayDate, ElementName=Month1,  Converter={StaticResource conv}}" />
    <Calendar x:Name="Month3" Grid.Column="2" DisplayDate="{Binding Path=DisplayDate, ElementName=Month2,  Converter={StaticResource conv}}"/>
  </Grid>
</Window>

Вот конвертер:

using System;
using System.Globalization;
using System.Windows.Data;

namespace CalendarTriggers
{
  public class CalendarConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      DateTime input = DateTime.Now;
      try
      {
        input = (DateTime)value;
        if (input != null)
        {
          input = input.AddMonths(1);
        }
      }
      catch (Exception)
      {
      }  
      return input;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      DateTime input = DateTime.Now;
      try
      {
        input = (DateTime)value;
        if (input != null)
        {
          input = input.AddMonths(-1);
        }
      }
      catch (Exception)
      {
      }
      return input;
    }
  }
}
...