This question is locked. New answers and comments are not allowed.
I have customized the TimeRulerItems using a custom Style Selector but now there is a 1 pixel margin after every n days (see attached screenshot). I can not figure out what is causing this behavior. I want to create equal width columns but the margin is causing each day to shift by 1 pixel. The blocks represent one appointment (e.g. a 7 day appointment is displayed as 7 blocks using a custom appointment brush). But as you can see they are not correctly aligned.
Telerik RadControls for Silverlight 4: 2011.3.1116.1040
MainPage.xaml
ScheduleViewModel.cs
CustomTimeRulerItemStyle.xaml
MajorTickToFormattedDateConverter.cs
MinorTickToFormattedDateConverter.cs
Telerik RadControls for Silverlight 4: 2011.3.1116.1040
MainPage.xaml
<
UserControl
x:Class
=
"CustomScheduleView.MainPage"
xmlns:local
=
"clr-namespace:CustomScheduleView"
mc:Ignorable
=
"d"
d:DesignHeight
=
"300"
d:DesignWidth
=
"400"
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
>
<
UserControl.Resources
>
<
ResourceDictionary
>
<
ResourceDictionary.MergedDictionaries
>
<
ResourceDictionary
Source
=
"/CustomScheduleView;component/Themes/Custom/CustomTimeRulerItemStyle.xaml"
/>
</
ResourceDictionary.MergedDictionaries
>
</
ResourceDictionary
>
</
UserControl.Resources
>
<
Grid
x:Name
=
"LayoutRoot"
Background
=
"White"
>
<
Grid.Resources
>
<
local:ScheduleViewModel
x:Key
=
"ScheduleViewModel"
/>
</
Grid.Resources
>
<
telerik:RadScheduleView
DataContext
=
"{StaticResource ScheduleViewModel}"
AppointmentsSource
=
"{Binding AppointmentsSource, Mode=OneWay}"
TimeRulerItemStyleSelector
=
"{StaticResource CustomTimeRulerItemStyleSelector}"
TimeRulerItemTemplateSelector
=
"{StaticResource CustomTimeRulerItemTemplateSelector}"
>
<
telerik:RadScheduleView.ViewDefinitions
>
<
telerik:TimelineViewDefinition
MinTimeRulerExtent
=
"3100"
MajorTickLength
=
"{Binding MajorTickLength, Mode=OneWay}"
MinorTickLength
=
"{Binding MinorTickLength, Mode=OneWay}"
GroupTickLength
=
"{Binding GroupTickLength, Mode=OneWay}"
VisibleDays
=
"{Binding LargeInterval.Days, Mode=OneWay}"
LargeChangeInterval
=
"{Binding LargeInterval, Mode=OneWay}"
Title
=
"Month"
Orientation
=
"Horizontal"
TimerulerGroupStringFormat
=
"{}{0:ddd}"
StretchGroupHeaders
=
"False"
/>
</
telerik:RadScheduleView.ViewDefinitions
>
</
telerik:RadScheduleView
>
</
Grid
>
</
UserControl
>
ScheduleViewModel.cs
using
System;
using
System.Net;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Documents;
using
System.Windows.Ink;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Animation;
using
System.Windows.Shapes;
namespace
CustomScheduleView
{
using
System.Collections.ObjectModel;
using
Telerik.Windows.Controls.ScheduleView;
public
sealed
class
ScheduleViewModel : ViewModelBase
{
private
ObservableCollection<Appointment> _oAppointmentsSource;
private
FixedTickProvider _oMajorTickLength;
private
FixedTickProvider _oMinorTickLength;
private
FixedTickProvider _oGroupTickLength;
private
DateTimeInterval _dtLargeInterval;
public
ScheduleViewModel()
:
base
()
{
this
._oAppointmentsSource =
new
ObservableCollection<Appointment>();
this
._oMajorTickLength =
new
FixedTickProvider(
new
DateTimeInterval(0, 1, 0, 0));
this
._oMinorTickLength =
new
FixedTickProvider(
new
DateTimeInterval(0, 1, 0, 0));
this
._oGroupTickLength =
new
FixedTickProvider(
new
DateTimeInterval(0, 0, 0, 1));
this
._dtLargeInterval =
new
DateTimeInterval(CalendarHelper.GetEndOfMonth(DateTime.Now).Day, 0);
}
public
ObservableCollection<Appointment> AppointmentsSource
{
get
{
return
this
._oAppointmentsSource; }
set
{
this
._oAppointmentsSource = value;
base
.OnPropertyChanged(
"AppointmentsSource"
);
}
}
public
FixedTickProvider MajorTickLength
{
get
{
return
this
._oMajorTickLength; }
set
{
this
._oMajorTickLength = value;
base
.OnPropertyChanged(
"MajorTickLength"
);
}
}
public
FixedTickProvider MinorTickLength
{
get
{
return
this
._oMinorTickLength; }
set
{
this
._oMinorTickLength = value;
base
.OnPropertyChanged(
"MinorTickLength"
);
}
}
public
FixedTickProvider GroupTickLength
{
get
{
return
this
._oGroupTickLength; }
set
{
this
._oGroupTickLength = value;
base
.OnPropertyChanged(
"GroupTickLength"
);
}
}
public
DateTimeInterval LargeInterval
{
get
{
return
this
._dtLargeInterval; }
set
{
this
._dtLargeInterval = value;
this
.OnPropertyChanged(
"LargeInterval"
);
}
}
}
}
CustomTimeRulerItemStyle.xaml
<
ResourceDictionary
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
xmlns:local
=
"clr-namespace:CustomScheduleView"
>
<
local:MajorTickToFormattedDateConverter
x:Key
=
"MajorTickToFormattedDateConverter"
/>
<
local:MinorTickToFormattedDateConverter
x:Key
=
"MinorTickToFormattedDateConverter"
/>
<
local:CustomTimeRulerItemStyleSelector
x:Key
=
"CustomTimeRulerItemStyleSelector"
>
<
local:CustomTimeRulerItemStyleSelector.HorizontalGroupItemStyle
>
<
Style
TargetType
=
"telerik:TimeRulerGroupItem"
>
<
Setter
Property
=
"FontFamily"
Value
=
"Segoe UI"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"telerik:TimeRulerGroupItem"
>
<
Border
Background
=
"#FFF6F8FA"
BorderThickness
=
"0,0,1,0"
BorderBrush
=
"#FFC6CBD2"
Height
=
"19"
>
<
ContentPresenter
x:Name
=
"Content"
/>
</
Border
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.HorizontalGroupItemStyle
>
<
local:CustomTimeRulerItemStyleSelector.MajorTickLineStyle
>
<
Style
TargetType
=
"telerik:TimeRulerLine"
>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"telerik:TimeRulerLine"
>
<
Border
BorderThickness
=
"2.5"
BorderBrush
=
"#FFFFFFFF"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.MajorTickLineStyle
>
<
local:CustomTimeRulerItemStyleSelector.HorizontalLineStyle
>
<
Style
TargetType
=
"telerik:TimeRulerLine"
>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"telerik:TimeRulerLine"
>
<
Border
BorderThickness
=
"2.5"
BorderBrush
=
"#FFFFFFFF"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.HorizontalLineStyle
>
<
local:CustomTimeRulerItemStyleSelector.MajorHorizontalTickStyle
>
<
Style
TargetType
=
"telerik:TimeRulerItem"
>
<
Setter
Property
=
"FontFamily"
Value
=
"Segoe UI"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"telerik:TimeRulerItem"
>
<
Border
Background
=
"#FFF6F8FA"
BorderThickness
=
"0,1"
BorderBrush
=
"#FFA0A0A4"
Margin
=
"0,1,0,0"
Height
=
"21"
>
<
ContentPresenter
Margin
=
"{TemplateBinding Padding}"
HorizontalAlignment
=
"{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment
=
"{TemplateBinding VerticalContentAlignment}"
/>
</
Border
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.MajorHorizontalTickStyle
>
<
local:CustomTimeRulerItemStyleSelector.MajorVerticalTickStyle
>
<
Style
TargetType
=
"telerik:TimeRulerItem"
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.MajorVerticalTickStyle
>
<
local:CustomTimeRulerItemStyleSelector.MinorHorizontalTickStyle
>
<
Style
TargetType
=
"telerik:TimeRulerItem"
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.MinorHorizontalTickStyle
>
<
local:CustomTimeRulerItemStyleSelector.MinorVerticalTickStyle
>
<
Style
TargetType
=
"telerik:TimeRulerItem"
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.MinorVerticalTickStyle
>
<
local:CustomTimeRulerItemStyleSelector.MonthViewGroupStyle
>
<
Style
TargetType
=
"telerik:TimeRulerMonthViewGroupItem"
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.MonthViewGroupStyle
>
<
local:CustomTimeRulerItemStyleSelector.MonthViewTickStyle
>
<
Style
TargetType
=
"telerik:TimeRulerMonthViewItem"
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.MonthViewTickStyle
>
<
local:CustomTimeRulerItemStyleSelector.MonthViewTodayTickStyle
>
<
Style
TargetType
=
"telerik:TimeRulerMonthViewItem"
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.MonthViewTodayTickStyle
>
<
local:CustomTimeRulerItemStyleSelector.VerticalGroupItemStyle
>
<
Style
TargetType
=
"telerik:TimeRulerGroupItem"
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.VerticalGroupItemStyle
>
<
local:CustomTimeRulerItemStyleSelector.VerticalLineStyle
>
<
Style
TargetType
=
"telerik:TimeRulerLine"
>
</
Style
>
</
local:CustomTimeRulerItemStyleSelector.VerticalLineStyle
>
</
local:CustomTimeRulerItemStyleSelector
>
<
local:CustomTimeRulerItemTemplateSelector
x:Key
=
"CustomTimeRulerItemTemplateSelector"
>
<
local:CustomTimeRulerItemTemplateSelector.HorizontalTimelineGroupTemplate
>
<
DataTemplate
>
<
StackPanel
HorizontalAlignment
=
"Center"
>
<
TextBlock
Text
=
"{Binding DateTime, Mode=OneWay, Converter={StaticResource MajorTickToFormattedDateConverter}}"
FontWeight
=
"Bold"
Foreground
=
"#FF000000"
/>
</
StackPanel
>
</
DataTemplate
>
</
local:CustomTimeRulerItemTemplateSelector.HorizontalTimelineGroupTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.HorizontalTimelineMajorItemTemplate
>
<
DataTemplate
>
<
StackPanel
HorizontalAlignment
=
"Center"
>
<
TextBlock
Text
=
"{Binding DateTime, Mode=OneWay, Converter={StaticResource MinorTickToFormattedDateConverter}}"
Foreground
=
"#FF000000"
/>
</
StackPanel
>
</
DataTemplate
>
</
local:CustomTimeRulerItemTemplateSelector.HorizontalTimelineMajorItemTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.HorizontalTimelineMinorItemTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.HorizontalTimelineMinorItemTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.HorizontalWeekMajorItemTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.HorizontalWeekMajorItemTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.HorizontalWeekMinorItemTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.HorizontalWeekMinorItemTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.HorizontalDayMajorItemTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.HorizontalDayMajorItemTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.HorizontalDayMinorItemTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.HorizontalDayMinorItemTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.VerticalTimelineGroupTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.VerticalTimelineGroupTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.VerticalDayMajorItemTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.VerticalDayMajorItemTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.VerticalDayMinorItemTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.VerticalDayMinorItemTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.VerticalWeekMajorItemTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.VerticalWeekMajorItemTemplate
>
<
local:CustomTimeRulerItemTemplateSelector.VerticalWeekMinorItemTemplate
>
<
DataTemplate
/>
</
local:CustomTimeRulerItemTemplateSelector.VerticalWeekMinorItemTemplate
>
</
local:CustomTimeRulerItemTemplateSelector
>
</
ResourceDictionary
>
MajorTickToFormattedDateConverter.cs
using
System;
using
System.Net;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Documents;
using
System.Windows.Ink;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Animation;
using
System.Windows.Shapes;
namespace
CustomScheduleView
{
using
System.Windows.Data;
public
sealed
class
MajorTickToFormattedDateConverter : IValueConverter
{
#region IValueConverter Members
public
object
Convert(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
if
(value
is
DateTime)
{
return
String.Format(
"Week of {0}"
, ((DateTime)value).ToShortDateString());
}
return
null
;
}
public
object
ConvertBack(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
throw
new
NotImplementedException();
}
#endregion
}
}
MinorTickToFormattedDateConverter.cs
using
System;
using
System.Net;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Documents;
using
System.Windows.Ink;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Animation;
using
System.Windows.Shapes;
namespace
CustomScheduleView
{
using
System.Windows.Data;
public
sealed
class
MinorTickToFormattedDateConverter : IValueConverter
{
#region IValueConverter Members
public
object
Convert(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
if
(value
is
DateTime)
{
return
((DateTime)value).ToString(
"ddd"
);
}
return
null
;
}
public
object
ConvertBack(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
throw
new
NotImplementedException();
}
#endregion
}
}