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

В одном из наших проектов нам бы хотелось иметь элемент управления календаря, который бы выглядел как календарь Outlook в недельном режиме, то есть по одной строке в день в течение 7 дней за один раз. В этом календаре мы добавляем ресурсы (т.е. объекты) на полчаса или более, и они будут отображаться в календаре.

Какой элемент управления лучше всего использовать в WPF для разработки такого элемента управления и почему? Я думал о простом просмотре списка с довольно сложным шаблоном элемента, но мне было интересно, можно ли использовать что-то более простое.

Спасибо

Редактировать: Я забыл упомянуть, что, скорее всего, я буду реализовывать перетаскивание для перетаскивания ресурсов в календарь и, возможно, если позволит время, для перемещения внутри самого календаря. Однако я не верю, что это сильно повлияет на выбор элемента управления, поскольку я считаю, что каждый элемент управления можно сделать сбрасываемым.

Редактировать: вот что у меня есть:

         <ItemsControl x:Name="ICPlanification" Grid.Column="1">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="*" />
                                            </Grid.ColumnDefinitions>

                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="20" />
                                                <RowDefinition Height="20" />
                                                <RowDefinition Height="20" />
                                                <RowDefinition Height="20" />
                                            </Grid.RowDefinitions>

                                        </Grid>

                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>

                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <Border Grid.Row="{Binding GridRow}" Grid.RowSpan="{Binding ColSpan}" Grid.Column="{Binding GridCol}" Grid.ColumnSpan="{Binding ColSpan}" CornerRadius="0" BorderBrush="White" BorderThickness="1" Background="{Binding ColorBackground}" Panel.ZIndex="{Binding ZIndex}">
                                            <TextBlock TextWrapping="Wrap" Text="{Binding Description}" ></TextBlock>
                                        </Border>

                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>

                            </ItemsControl>

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

И прежде чем кто-либо спросит, да, переменные GridRol и GridCol имеют правильные значения в моем списке.

Просматривая некоторые форумы, я кое-что выяснил, и это сработало!

<ItemsControl.Resources>
            <Style TargetType="{x:Type ContentPresenter}">
                <Setter Property="Grid.Column" Value="{Binding Path=Column}" />
                <Setter Property="Grid.Row" Value="{Binding Path=Row}" />
            </Style>
</ItemsControl.Resources

Вот объяснение, которое он дал:

"Проблема, с которой все сталкиваются в Grid и динамическом связывании Row и Column, заключается в том, что ItemsControl оборачивает каждый элемент в ContentPresenter, поэтому привязка Grid.Row и Grid.Column в DataTemplate игнорируется, и поскольку Свойства Grid.Row и Grid.Column в сгенерированном ContentPresenter не устанавливаются, тогда каждый элемент располагается поверх друг друга в столбце 0, строке 0. Это можно обойти, установив следующий стиль на ItemsControl. "

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Это зависит от того, как выглядят ваши объекты DataObject.

Если у вас есть List<Day>[7] Дней, и каждый день имеет свойство List<TimeFrame>[48] Таймфреймов, я бы использовал ItemsControl сItemsPanelTemplate - это StackPanel Orientation=Horizontal, тогда ItemTemplate - это обычная вертикаль StackPanel, содержащая заголовок для дня недели, и ListBox для разных таймфреймов.

Если у вас просто есть List<Reminder> и Reminders имеют свойства Day и Time, чем я бы сделал ItemsControl с ItemsPanelTemplate, являющимся Grid и ItemTemplate, являющимся объектом, который связывает Grid.Row и Grid.Column используя конвертер, чтобы получить правильное место в сетке для дня и времени

0 голосов
/ 26 июля 2011

Если у вашего проекта есть бюджет на внешние элементы управления, и вы не хотите тратить время на реализацию этого самостоятельно, тогда я предлагаю вам взглянуть на элементы управления Telerik WPF, которые включают элемент управления представлением расписания. Вот ссылка на страницу , которая также содержит демоверсию.

...