ShowAs stripe for calendar control template.

This commit is contained in:
Burak Kaan Köse
2026-01-06 12:54:47 +01:00
parent a23a99cc8d
commit 7cc201f423
4 changed files with 95 additions and 10 deletions
@@ -23,6 +23,7 @@
Tapped="ControlTapped"
ToolTipService.ToolTip="{x:Bind CalendarItem.DisplayTitle, Mode=OneWay}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
@@ -36,20 +37,36 @@
</local:CalendarItemCommandBarFlyout>
</Grid.ContextFlyout>
<Grid
x:Name="MainBackground"
Grid.Column="1"
Grid.ColumnSpan="2"
Background="{x:Bind helpers:XamlHelpers.GetSolidColorBrushFromHex(CalendarItem.AssignedCalendar.BackgroundColorHex), Mode=OneWay}" />
Background="{x:Bind helpers:XamlHelpers.GetSolidColorBrushFromHex(CalendarItem.AssignedCalendar.BackgroundColorHex), Mode=OneWay}"
Opacity="0.9" />
<Rectangle
x:Name="MainBorder"
Grid.Column="1"
Grid.ColumnSpan="2"
Canvas.ZIndex="2"
Stroke="{ThemeResource CalendarItemBorderBrush}"
StrokeThickness="0" />
<!-- ShowAs Status Stripe -->
<ContentControl
x:Name="ShowAsStripe"
Grid.Column="0"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
Canvas.ZIndex="10000"
Content="{x:Bind CalendarItem}"
ContentTemplateSelector="{StaticResource ShowAsStripeSelector}"
IsTabStop="False" />
<TextBlock
x:Name="EventTitleTextblock"
Grid.Column="1"
Margin="2,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
@@ -63,7 +80,7 @@
<!-- TODO: Event attributes -->
<StackPanel
x:Name="AttributeStack"
Grid.Column="1"
Grid.Column="2"
Margin="0,4,4,0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
@@ -0,0 +1,36 @@
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Wino.Calendar.ViewModels.Data;
using Wino.Core.Domain.Enums;
namespace Wino.Selectors;
/// <summary>
/// DataTemplateSelector that selects the appropriate stripe template based on CalendarItemShowAs status.
/// </summary>
public class CalendarItemShowAsStripeTemplateSelector : DataTemplateSelector
{
public DataTemplate FreeTemplate { get; set; }
public DataTemplate TentativeTemplate { get; set; }
public DataTemplate BusyTemplate { get; set; }
public DataTemplate OutOfOfficeTemplate { get; set; }
public DataTemplate WorkingElsewhereTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
if (item is CalendarItemViewModel calendarItem)
{
return calendarItem.CalendarItem.ShowAs switch
{
CalendarItemShowAs.Free => FreeTemplate,
CalendarItemShowAs.Tentative => TentativeTemplate,
CalendarItemShowAs.Busy => BusyTemplate,
CalendarItemShowAs.OutOfOffice => OutOfOfficeTemplate,
CalendarItemShowAs.WorkingElsewhere => WorkingElsewhereTemplate,
_ => BusyTemplate // Default to Busy
};
}
return base.SelectTemplateCore(item, container);
}
}
@@ -25,9 +25,42 @@
</Grid>
</DataTemplate>
<!-- ShowAs Status Stripe Templates -->
<DataTemplate x:Key="FreeStripeTemplate" x:DataType="data:CalendarItemViewModel">
<Border Background="#4CAF50" />
</DataTemplate>
<DataTemplate x:Key="TentativeStripeTemplate" x:DataType="data:CalendarItemViewModel">
<Border Background="#FFC107" />
</DataTemplate>
<DataTemplate x:Key="BusyStripeTemplate" x:DataType="data:CalendarItemViewModel">
<Border Background="#F44336" />
</DataTemplate>
<DataTemplate x:Key="OutOfOfficeStripeTemplate" x:DataType="data:CalendarItemViewModel">
<Border Background="#9C27B0" />
</DataTemplate>
<DataTemplate x:Key="WorkingElsewhereStripeTemplate" x:DataType="data:CalendarItemViewModel">
<Border Background="#2196F3" />
</DataTemplate>
<!-- ShowAs Status Stripe Selector -->
<selectors1:CalendarItemShowAsStripeTemplateSelector
x:Key="ShowAsStripeSelector"
BusyTemplate="{StaticResource BusyStripeTemplate}"
FreeTemplate="{StaticResource FreeStripeTemplate}"
OutOfOfficeTemplate="{StaticResource OutOfOfficeStripeTemplate}"
TentativeTemplate="{StaticResource TentativeStripeTemplate}"
WorkingElsewhereTemplate="{StaticResource WorkingElsewhereStripeTemplate}" />
<!-- Vertical panel that renders items on canvas. -->
<DataTemplate x:Key="DayCalendarItemVerticalRenderTemplate" x:DataType="models:CalendarDayModel">
<ItemsControl x:Name="RegularEventItemsControl" ItemsSource="{x:Bind EventsCollection.RegularEvents}" Loaded="OnRegularEventItemsControlLoaded">
<ItemsControl
x:Name="RegularEventItemsControl"
ItemsSource="{x:Bind EventsCollection.RegularEvents}"
Loaded="OnRegularEventItemsControlLoaded">
<ItemsControl.ItemTemplate>
<!-- Default Calendar Item View Model Template -->
<DataTemplate x:DataType="data:CalendarItemViewModel">
@@ -60,7 +93,11 @@
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ItemsControl x:Name="DayColumnsItemsControl" Margin="50,0,16,0" ItemsSource="{x:Bind CalendarDays}" Loaded="OnDayColumnsItemsControlLoaded">
<ItemsControl
x:Name="DayColumnsItemsControl"
Margin="50,0,16,0"
ItemsSource="{x:Bind CalendarDays}"
Loaded="OnDayColumnsItemsControlLoaded">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:CalendarDayModel">
<controls:DayColumnControl DayModel="{x:Bind}" />