MindFusion.Wpf Pack Programmer's Guide
The Default Item Template

Below is the complete XAML code of the default style of the item presenter.

XAML  Copy Code

<!-- Static images -->
<BitmapImage x:Key="HiddenItemsImage" UriSource="pack://application:,,,/MindFusion.Scheduling.Wpf;component/Resources/MoreDown.png" />
<BitmapImage x:Key="RecurrenceImage" UriSource="pack://application:,,,/MindFusion.Scheduling.Wpf;component/Resources/Recurrence.png" />
<BitmapImage x:Key="RecurrenceExImage" UriSource="pack://application:,,,/MindFusion.Scheduling.Wpf;component/Resources/RecurrenceEx.png" />
<BitmapImage x:Key="ReminderImage" UriSource="pack://application:,,,/MindFusion.Scheduling.Wpf;component/Resources/Reminder.png" />
<BitmapImage x:Key="ArrowLeftImage" UriSource="pack://application:,,,/MindFusion.Scheduling.Wpf;component/Resources/ArrowLeft.png" />
<BitmapImage x:Key="ArrowRightImage" UriSource="pack://application:,,,/MindFusion.Scheduling.Wpf;component/Resources/ArrowRight.png" />
<BitmapImage x:Key="ArrowUpImage" UriSource="pack://application:,,,/MindFusion.Scheduling.Wpf;component/Resources/ArrowUp.png" />
<BitmapImage x:Key="ArrowDownImage" UriSource="pack://application:,,,/MindFusion.Scheduling.Wpf;component/Resources/ArrowDown.png" />

<Style TargetType="local:ItemPresenter">
  <Style.Triggers>

    <DataTrigger Binding="{Binding StyleKey, RelativeSource={RelativeSource Self}}" Value="Complex">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="local:ItemPresenter">
            <local:ResizeBands 
              MoveBandMargin="{TemplateBinding MoveBandMargin}"
              Orientation="{TemplateBinding Orientation}"
              DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"
              ItemSettings="{TemplateBinding ItemSettings}"
              ResizeBandsVisible="{TemplateBinding Selected}">
              <local:SideBorders>
                <Border Background="{Binding ItemStyle.Background}">
                  <Grid>
                    <Grid.ColumnDefinitions>
                      <ColumnDefinition Width="Auto" />
                      <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <StackPanel Orientation="Vertical">
                      <Border Visibility="{Binding Path=ItemSettings.ShowRecurrenceIcons, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}, ConverterParameter=true}">
                        <Image Source="{StaticResource RecurrenceImage}" Visibility="{Binding RecurrenceIconVisibility}"  Margin="1"/>
                      </Border>
                      <Border Visibility="{Binding Path=ItemSettings.ShowRecurrenceExceptionIcons, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}, ConverterParameter=true}">
                        <Image Source="{StaticResource RecurrenceExImage}" Visibility="{Binding RecurrenceExceptionIconVisibility}"  Margin="1"/>
                      </Border>
                      <Border Visibility="{Binding Path=ItemSettings.ShowReminderIcons, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}, ConverterParameter=true}">
                        <Image Source="{StaticResource ReminderImage}" Visibility="{Binding ReminderIconVisibility}"  Margin="1"/>
                      </Border>
                    </StackPanel>
                    <StackPanel Grid.Column="1" Orientation="Vertical">
                      <Border
                        BorderBrush="{Binding ItemStyle.LineBrush}"
                        BorderThickness="0,0,0,1"
                        Height="{Binding ItemSettings.HeaderSize}"
                        Margin="6,0,6,0">
                        <TextBlock x:Name="HeaderBlock"
                          Margin="{TemplateBinding HeaderTextMargin}"
                          TextWrapping="Wrap"
                          Text="{Binding Item.HeaderText, RelativeSource={RelativeSource TemplatedParent}}"
                          DataContext="{TemplateBinding ItemStyle}"
                          Foreground="{Binding Foreground}"
                          TextAlignment="{Binding TextAlignment}"
                          VerticalAlignment="{Binding VerticalAlignment}"
                          FontFamily="{Binding FontFamily}"
                          FontSize="{Binding FontSize}"
                          FontStretch="{Binding FontStretch}"
                          FontStyle="{Binding FontStyle}"
                          FontWeight="{Binding FontWeight}" />
                      </Border>
                      <TextBlock
                        DataContext="{TemplateBinding Item}"
                        TextWrapping="Wrap" Text="{Binding DescriptionText}"
                        Margin="5,1,1,1" Grid.Column="1" Grid.Row="1" />
                    </StackPanel>
                  </Grid>
                </Border>
              </local:SideBorders>
            </local:ResizeBands>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </DataTrigger>

    <MultiDataTrigger>
      <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding StyleKey, RelativeSource={RelativeSource Self}}" Value="Simple" />
        <Condition Binding="{Binding Orientation, RelativeSource={RelativeSource Self}}" Value="Horizontal" />
      </MultiDataTrigger.Conditions>
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="local:ItemPresenter">
            <Grid
              DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"
              Background="{Binding ItemStyle.Background}">
              <local:SideBorders>
                <Grid>
                  <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition />
                    <ColumnDefinition Width="Auto" />
                  </Grid.ColumnDefinitions>
                  <Image Grid.Column="0"
                    Visibility="{TemplateBinding StartArrowImageVisibility}"
                    HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" Margin="1"
                    Source="{StaticResource ArrowLeftImage}" />
                  <StackPanel Orientation="Horizontal" Grid.Column="1">
                    <Border Visibility="{Binding Path=ItemSettings.ShowRecurrenceIcons, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}, ConverterParameter=true}">
                      <Image Source="{StaticResource RecurrenceImage}" Visibility="{Binding RecurrenceIconVisibility}" Stretch="None"  Margin="1"/>
                    </Border>
                    <Border Visibility="{Binding Path=ItemSettings.ShowRecurrenceExceptionIcons, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}, ConverterParameter=true}">
                      <Image Source="{StaticResource RecurrenceExImage}" Visibility="{Binding RecurrenceExceptionIconVisibility}" Stretch="None" Margin="1"/>
                    </Border>
                    <Border Visibility="{Binding Path=ItemSettings.ShowReminderIcons, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}, ConverterParameter=true}">
                      <Image Source="{StaticResource ReminderImage}" Visibility="{Binding ReminderIconVisibility}" Stretch="None" Margin="1"/>
                    </Border>
                  </StackPanel>
                  <TextBlock x:Name="HeaderBlock" Grid.Column="2"
                    TextWrapping="Wrap"
                    Text="{Binding Item.HeaderText, RelativeSource={RelativeSource TemplatedParent}}"
                    DataContext="{TemplateBinding ItemStyle}"
                    Foreground="{Binding Foreground}"
                    TextAlignment="{Binding TextAlignment}"
                    VerticalAlignment="{Binding VerticalAlignment}"
                    FontFamily="{Binding FontFamily}"
                    FontSize="{Binding FontSize}"
                    FontStretch="{Binding FontStretch}"
                    FontStyle="{Binding FontStyle}"
                    FontWeight="{Binding FontWeight}" />
                  <Image Grid.Column="3"
                    Visibility="{TemplateBinding EndArrowImageVisibility}"
                    HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" Margin="1"
                    Source="{StaticResource ArrowRightImage}"/>
                </Grid>
              </local:SideBorders>
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </MultiDataTrigger>

    <MultiDataTrigger>
      <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding StyleKey, RelativeSource={RelativeSource Self}}" Value="Simple" />
        <Condition Binding="{Binding Orientation, RelativeSource={RelativeSource Self}}" Value="Vertical" />
      </MultiDataTrigger.Conditions>
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="local:ItemPresenter">
            <Grid
              DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"
              Background="{Binding ItemStyle.Background}">
              <local:SideBorders>
                <Grid>
                  <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition />
                    <RowDefinition Height="Auto" />
                  </Grid.RowDefinitions>
                  <Image Grid.Row="0"
                    Visibility="{TemplateBinding StartArrowImageVisibility}"
                    HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" Margin="1"
                    Source="{StaticResource ArrowUpImage}" />
                  <StackPanel Orientation="Vertical" Grid.Row="1">
                    <Border Visibility="{Binding Path=ItemSettings.ShowRecurrenceIcons, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}, ConverterParameter=true}">
                      <Image Source="{StaticResource RecurrenceImage}" Visibility="{Binding RecurrenceIconVisibility}" Stretch="None"  Margin="1"/>
                    </Border>
                    <Border Visibility="{Binding Path=ItemSettings.ShowRecurrenceExceptionIcons, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}, ConverterParameter=true}">
                      <Image Source="{StaticResource RecurrenceExImage}" Visibility="{Binding RecurrenceExceptionIconVisibility}" Stretch="None" Margin="1"/>
                    </Border>
                    <Border Visibility="{Binding Path=ItemSettings.ShowReminderIcons, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}, ConverterParameter=true}">
                      <Image Source="{StaticResource ReminderImage}" Visibility="{Binding ReminderIconVisibility}" Stretch="None" Margin="1"/>
                    </Border>
                  </StackPanel>
                  <TextBlock x:Name="HeaderBlock" Grid.Row="2"
                    TextWrapping="Wrap"
                    Text="{Binding Item.HeaderText, RelativeSource={RelativeSource TemplatedParent}}"
                    DataContext="{TemplateBinding ItemStyle}"
                    Foreground="{Binding Foreground}"
                    TextAlignment="{Binding TextAlignment}"
                    VerticalAlignment="{Binding VerticalAlignment}"
                    FontFamily="{Binding FontFamily}"
                    FontSize="{Binding FontSize}"
                    FontStretch="{Binding FontStretch}"
                    FontStyle="{Binding FontStyle}"
                    FontWeight="{Binding FontWeight}" />
                  <Image Grid.Row="3"
                    Visibility="{TemplateBinding EndArrowImageVisibility}"
                    HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" Margin="1"
                    Source="{StaticResource ArrowDownImage}" />
                </Grid>
              </local:SideBorders>
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </MultiDataTrigger>

  </Style.Triggers>
</Style>

<Style TargetType="local:SideBorders">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="local:SideBorders">
        <Grid>
          <Rectangle HorizontalAlignment="Left"
            Width="{Binding BorderThickness.Left}"
            Fill="{Binding ItemStyle.LeftBorderBrush}" />
          <Rectangle VerticalAlignment="Top"
            Height="{Binding BorderThickness.Top}"
            Fill="{Binding ItemStyle.TopBorderBrush}" />
          <Rectangle HorizontalAlignment="Right"
            Width="{Binding BorderThickness.Right}"
            Fill="{Binding ItemStyle.RightBorderBrush}" />
          <Rectangle VerticalAlignment="Bottom"
            Height="{Binding BorderThickness.Bottom}"
            Fill="{Binding ItemStyle.BottomBorderBrush}" />
          <Border BorderThickness="{Binding BorderThickness}">
            <ContentPresenter Margin="{Binding ItemStyle.ContentMargin}" />
          </Border>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

<Style TargetType="local:ResizeBands">
  <Style.Resources>
    <local:VisibleConverter x:Key="visibleConverter"/>
  </Style.Resources>
  <Style.Triggers>

    <Trigger Property="Orientation" Value="Vertical">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="local:ResizeBands">
            <Grid>
              <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
                <RowDefinition Height="Auto" />
              </Grid.RowDefinitions>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition />
              </Grid.ColumnDefinitions>
              <Border x:Name="ResizeBandBack"
                Grid.ColumnSpan="2"
                BorderThickness="1,1,1,0"
                Background="{Binding ItemStyle.FillBrush}"
                BorderBrush="{Binding ItemStyle.BorderBrush}"
                Height="{Binding ItemSettings.ResizeBandSize}"
                Visibility="{Binding ResizeBandsVisible, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}}" />
              <Border x:Name="UnderMoveBand"
                Grid.Row="1"
                BorderThickness="1,1,0,1"
                BorderBrush="{Binding ItemStyle.BorderBrush}"
                Width="{Binding ItemSettings.MoveBandSize}"
                Background="White" />
              <Border x:Name="MoveBand"
                Grid.Row="1"
                BorderThickness="1,1,0,1"
                Width="{Binding ItemSettings.MoveBandSize}"
                Margin="{TemplateBinding MoveBandMargin}"
                Background="{Binding ItemStyle.FillBrush}"
                BorderBrush="{Binding ItemStyle.BorderBrush}" />
              <Border x:Name="ResizeBandForward"
                Grid.Row="2" Grid.ColumnSpan="2"
                BorderThickness="1,0,1,1"
                Background="{Binding ItemStyle.FillBrush}"
                BorderBrush="{Binding ItemStyle.BorderBrush}"
                Height="{Binding ItemSettings.ResizeBandSize}"
                Visibility="{Binding ResizeBandsVisible, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}}" />
              <ContentPresenter Grid.Column="1" Grid.Row="1"/>
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Trigger>

    <Trigger Property="Orientation" Value="Horizontal">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="local:ResizeBands">
            <Grid>
              <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
              </Grid.RowDefinitions>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition />
                <ColumnDefinition Width="Auto" />
              </Grid.ColumnDefinitions>
              <Border x:Name="ResizeBandBackHorizontal"
                Grid.RowSpan="2"
                BorderThickness="1,1,0,1"
                Width="{Binding ItemSettings.ResizeBandSize}"
                Background="{Binding ItemStyle.FillBrush}"
                BorderBrush="{Binding ItemStyle.BorderBrush}"
                Visibility="{Binding ResizeBandsVisible, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}}" />
              <Border x:Name="UnderMoveBandHorizontal"
                Grid.Column="1"
                Background="White"
                BorderThickness="1,1,1,0"
                BorderBrush="{Binding ItemStyle.BorderBrush}"
                Height="{Binding ItemSettings.MoveBandSize}"/>
              <Border x:Name="MoveBandHorizontal"
                Grid.Column="1"
                BorderThickness="1,1,1,0"
                Background="{Binding ItemStyle.FillBrush}"
                BorderBrush="{Binding ItemStyle.BorderBrush}"
                Margin="{TemplateBinding MoveBandMargin}"
                Height="{Binding ItemSettings.MoveBandSize}" />
              <Border x:Name="ResizeBandForwardHorizontal"
                Grid.Column="2" Grid.RowSpan="2"
                BorderThickness="0,1,1,1"
                Width="{Binding ItemSettings.ResizeBandSize}"
                Background="{Binding ItemStyle.FillBrush}"
                BorderBrush="{Binding ItemStyle.BorderBrush}"
                Visibility="{Binding ResizeBandsVisible, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource visibleConverter}}" />
              <ContentPresenter Grid.Column="1" Grid.Row="1" />
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Trigger>

  </Style.Triggers>
</Style>

The local namespace is defined as follows:

XAML  Copy Code

xmlns:local="clr-namespace:MindFusion.Scheduling.Wpf;assembly=MindFusion.Scheduling.Wpf"

As can be seen in the above XAML, the style contains several triggers. Each trigger supplies a control template for the items in different contexts. For example, the first trigger supplies the template of the so-called complex items. Those are the items in Resource view and non all day items in Timetable view. The trigger is activated when the value of the StyleKey property is set to "Complex".

XAML  Copy Code

<DataTrigger Binding="{Binding StyleKey, RelativeSource={RelativeSource Self}}" Value="Complex">
...

The next trigger supplies the template of the so-called simple items when they are displayed horizontally. Simple items are all day items in Timetable view and the items in SingleMonth, MonthRange, List and WeekRange views. The trigger is activated when the value of the StyleKey property is set to "Simple" and the value of the Orientation property is set to Horizontal.

XAML  Copy Code

<MultiDataTrigger>
  <MultiDataTrigger.Conditions>
    <Condition Binding="{Binding StyleKey, RelativeSource={RelativeSource Self}}" Value="Simple" />
    <Condition Binding="{Binding Orientation, RelativeSource={RelativeSource Self}}" Value="Horizontal" />
  </MultiDataTrigger.Conditions>
...

The last trigger supplies the template for simple items, displayed vertically.

The following table illustrates the presentation of the same item in the three different contexts:

Condition

Presentation

StyleKey=Complex

StyleKey=Simple, Orientation=Horizontal

StyleKey=Simple, Orientation=Vertical

It is completely legal to define a single control template for the three cases.

Named Elements

There is one element of particular interest in the template - HeaderBlock. This element is used when initiating item in-place editing operations in order to determine where the in-place text box should be opened. If you create a custom template and want to retain the in-place editing functionality you need to name an element HeaderBlock. Additionally you need to place this element in either grid or border parent.