Отображение дней в пользовательском календаре wpf - PullRequest
0 голосов
/ 27 октября 2011

Я пытаюсь отобразить дни месяца в специальном календаре в нужном месте.Используя привязку и используя наблюдаемую коллекцию, у меня есть сетка с 7 столбцами и 6 строками, мне нужно отображать дату (число) на каждом текстовом блоке.Я дошел до того, что совершенно потерян и не знаю, что еще попробовать.Как-то мне нужно узнать день недели и какой сегодня день.Я даже не уверен, правильно ли я поступлю.Я знаю, что XAML хорош (должен быть по крайней мере), хотя я запутался в использовании даты и времени и наблюдаемых коллекций.Любая помощь очень ценится.

Здесь я использую коллекцию Observable:

public SchedulePage(MainWindow parentForm)
{
   InitializeComponent();
   _parentForm = parentForm;
   // DateTime date = new DateTime(year, month, day);

   _parentForm.bindings = new BindingCamper();

   int day = DateTime.DaysInMonth(2011, 10);

   for (int i = 0; i < 6; i++)
   {
      for (int j = 0; j < 7; j++)
      {
         _parentForm.bindings.schedule.Add(new Schedule { WeekNo = i, WeekDay = j });
         DataContext = _parentForm.bindings;
      }
    }
}

У меня есть класс Schedule:

public class Schedule //: INotifyPropertyChanged
{
    public int WeekNo { get; set; }
    public int WeekDay { get; set; }
    public DateTime Date { get; set; }

    public int datenum
    {
        get { return (int)Date.DayOfWeek; }
    }
}

И XAML:

<ItemsControl ItemsSource="{Binding schedule}" Name="Calender" Margin="0,34,0,0" VerticalAlignment="Stretch">
  <ItemsControl.Template>
    <ControlTemplate TargetType="ItemsControl" >
        <Border BorderBrush="Aqua" BorderThickness="1" CornerRadius="15">
            <ItemsPresenter/>
        </Border>

    </ControlTemplate>



  </ItemsControl.Template>
<!-- ItemsPanelTemplate -->
  <ItemsControl.ItemsPanel>

    <ItemsPanelTemplate>

        <Grid ShowGridLines="True" Name="gridCalender">

            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

        </Grid>
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

<ItemsControl.ItemTemplate>

    <DataTemplate>

        <TextBlock Text ="{Binding datenum}" Background="#FFBCF4E0" OpacityMask="Black" Grid.Column="{Binding datenum}" />


    </DataTemplate>
</ItemsControl.ItemTemplate>


<!-- ItemContainerStyle -->
 <ItemsControl.ItemContainerStyle>
    <Style >
        <Setter Property="Grid.Column" Value="{Binding WeekDay}" />
        <Setter Property="Grid.Row" Value="{Binding WeekNo}" />

    </Style>
 </ItemsControl.ItemContainerStyle>
</ItemsControl>

У меня также есть класс, создающий новую ObservableCollection ();

1 Ответ

0 голосов
/ 27 октября 2011

Ваш цикл для создания дат, вероятно, должен представлять собой цикл по датам, причем значения WeekNo и WeekDay рассчитываются на основе даты

Например,

DateTime today = DateTime.Now;
DateTime startDate = new DateTime(today.Year, today.Month, 1);
DateTime endDate = startDate.AddMonths(1).AddDays(-1);

while (startDate <= endDate)
{
    DayCollection.Add(new Day
    {
        Date = startDate,
        WeekDay = (int)startDate.DayOfWeek,
        WeekNo = startDate.GetWeekOfMonth()
    });

    startDate = startDate.AddDays(1);
}

Он использует метод расширения, чтобы найти номер недели в месяце, который можно найти в другом вопросе SO

static class DateTimeExtensions
{
    static GregorianCalendar _gc = new GregorianCalendar();
    public static int GetWeekOfMonth(this DateTime time)
    {
        DateTime first = new DateTime(time.Year, time.Month, 1);
        return time.GetWeekOfYear() - first.GetWeekOfYear() + 1;
    }

    static int GetWeekOfYear(this DateTime time)
    {
        return _gc.GetWeekOfYear(time, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
    }
}
...