前の手順では、C1Calendar コントロールをアプリケーションに追加しました。この手順では、DataSeries オブジェクトとそのデータを追加します。
プログラムでカレンダーにデータを追加するには、次の手順に従います。
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
Imports Windows.UI.ViewManagement Imports C1.Xaml Imports C1.Xaml.Calendar |
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
using Windows.UI.ViewManagement; using C1.Xaml; using C1.Xaml.Calendar; |
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
' 予定の辞書
Private _boldedDays As New Dictionary(Of DateTime, String)()
Private _dayTemplateSelector As DaySlotTemplateSelector = Nothing
Private _loaded As Boolean = False
|
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
// 予定の辞書
private Dictionary<DateTime, string> _boldedDays = new Dictionary<DateTime, string>();
private DaySlotTemplateSelector _dayTemplateSelector = null;
private bool _loaded = false;
|
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
Public Sub New()
Me.InitializeComponent()
AddHandler Window.Current.SizeChanged, AddressOf Current_SizeChanged
Calendar.DayOfWeekSlotTemplateSelector = New DayOfWeekTemplateSelector()
' 太字の日を追加します
_boldedDays.Add(DateTime.Today.AddDays(2), "スポーツ\r\nを忘れない。")
_boldedDays.Add(DateTime.Today.AddDays(13), "誕生日")
_boldedDays.Add(DateTime.Today.AddDays(22), "重要な会議")
_boldedDays.Add(DateTime.Today.AddDays(-1), "8時に記念& vbCr & vbLf &パーティー")
_boldedDays.Add(DateTime.Today.AddDays(-12), "医者との約束")
_boldedDays.Add(DateTime.Today.AddDays(-21), "会議2日目")
_boldedDays.Add(DateTime.Today.AddDays(-22), "会議1日目")
For Each val As DateTime In _boldedDays.Keys
Calendar.BoldedDates.Add(val)
Next
End Sub
|
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
public MainPage()
{
this.InitializeComponent();
Window.Current.SizeChanged += Current_SizeChanged;
Calendar.DayOfWeekSlotTemplateSelector = new DayOfWeekTemplateSelector();
// 太字の日を追加します
_boldedDays.Add(DateTime.Today.AddDays(2), "スポーツ\r\nを忘れない。");
_boldedDays.Add(DateTime.Today.AddDays(13), "誕生日");
_boldedDays.Add(DateTime.Today.AddDays(22), "重要な会議");
_boldedDays.Add(DateTime.Today.AddDays(-1), "8時に記念\r\nパーティー");
_boldedDays.Add(DateTime.Today.AddDays(-12), "医者との約束");
_boldedDays.Add(DateTime.Today.AddDays(-21), "会議2日目");
_boldedDays.Add(DateTime.Today.AddDays(-22), "会議1日目");
foreach (DateTime val in _boldedDays.Keys)
{
Calendar.BoldedDates.Add(val);
}
}
|
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
Private Sub Calendar_SelectedDateChanged(sender As Object, e As DateChangedEventArgs)
If Calendar.SelectedDates.Count > 0 AndAlso _boldedDays.ContainsKey(Calendar.SelectedDates(0)) Then
dayInfo.Text = _boldedDays(Calendar.SelectedDates(0))
Else
dayInfo.Text = ""
End If
End Sub
''' <summary>
''' 日付を太字にするためのカスタム DataTemplate を使用する DayTemplateSelector
''' </summary>
Private ReadOnly Property DayTemplateSelector() As DaySlotTemplateSelector
Get
If _dayTemplateSelector Is Nothing Then
_dayTemplateSelector = TryCast(Resources("DaySlotTemplateSelector"), DaySlotTemplateSelector)
If _dayTemplateSelector IsNot Nothing Then
_dayTemplateSelector.BoldedDays = Me._boldedDays
End If
End If
Return _dayTemplateSelector
End Get
End Property
Private Sub Current_SizeChanged(sender As Object, e As Windows.UI.Core.WindowSizeChangedEventArgs)
UpdateViewState()
End Sub
Private Sub UpdateViewState()
Calendar.ClearValue(HeightProperty)
Select Case ApplicationView.Value
Case ApplicationViewState.Filled
Calendar.DaySlotTemplateSelector = DayTemplateSelector
VisualStateManager.GoToState(Me, "Fill", False)
Exit Select
Case ApplicationViewState.FullScreenLandscape
Calendar.DaySlotTemplateSelector = DayTemplateSelector
VisualStateManager.GoToState(Me, "Full", False)
Exit Select
Case ApplicationViewState.Snapped
' あまりスペースがないので、デフォルトの DaySlotTemplateSelector を使用します
Calendar.Height = 400
Calendar.DaySlotTemplateSelector = TryCast(Resources("SmallDaySlotTemplateSelector"), DataTemplateSelector)
VisualStateManager.GoToState(Me, "Snapped", False)
Exit Select
Case ApplicationViewState.FullScreenPortrait
Calendar.DaySlotTemplateSelector = DayTemplateSelector
VisualStateManager.GoToState(Me, "Portrait", False)
Exit Select
Case Else
Return
End Select
Calendar.UpdateLayout()
End Sub
''' <summary>
''' このページが Frame に表示されるときに呼び出されます。
''' </summary>
''' <param name="e">このページにどのように到達したかを説明するイベントデータ。
''' Parameter プロパティは通常、ページの構成に使用されます。</param>
Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
UpdateViewState()
_loaded = True
End Sub
Protected Overrides Sub OnNavigatedFrom(e As NavigationEventArgs)
_loaded = False
MyBase.OnNavigatedFrom(e)
End Sub
|
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
void Calendar_SelectedDateChanged(object sender, DateChangedEventArgs e)
{
if (Calendar.SelectedDates.Count > 0 && _boldedDays.ContainsKey(Calendar.SelectedDates[0]))
{
dayInfo.Text = _boldedDays[Calendar.SelectedDates[0]];
}
else
{
dayInfo.Text = "";
}
}
/// <summary>
/// 日付を太字にするためのカスタム DataTemplate を使用する DayTemplateSelector
/// </summary>
private DaySlotTemplateSelector DayTemplateSelector
{
get
{
if (_dayTemplateSelector == null)
{
_dayTemplateSelector = Resources["DaySlotTemplateSelector"] as DaySlotTemplateSelector;
if (_dayTemplateSelector != null)
{
_dayTemplateSelector.BoldedDays = this._boldedDays;
}
}
return _dayTemplateSelector;
}
}
void Current_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
{
UpdateViewState();
}
private void UpdateViewState()
{
Calendar.ClearValue(HeightProperty);
switch (ApplicationView.Value)
{
case ApplicationViewState.Filled:
Calendar.DaySlotTemplateSelector = DayTemplateSelector;
VisualStateManager.GoToState(this, "Fill", false);
break;
case ApplicationViewState.FullScreenLandscape:
Calendar.DaySlotTemplateSelector = DayTemplateSelector;
VisualStateManager.GoToState(this, "Full", false);
break;
case ApplicationViewState.Snapped:
// あまりスペースがないので、デフォルトの DaySlotTemplateSelector を使用します
Calendar.Height = 400;
Calendar.DaySlotTemplateSelector = Resources["SmallDaySlotTemplateSelector"] as DataTemplateSelector;
VisualStateManager.GoToState(this, "Snapped", false);
break;
case ApplicationViewState.FullScreenPortrait:
Calendar.DaySlotTemplateSelector = DayTemplateSelector;
VisualStateManager.GoToState(this, "Portrait", false);
break;
default:
return;
}
Calendar.UpdateLayout();
}
/// <summary>
/// このページが Frame に表示されるときに呼び出されます。
/// </summary>
/// <param name="e">このページにどのように到達したかを説明するイベントデータ。
/// Parameter プロパティは通常、ページの構成に使用されます。</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
UpdateViewState();
_loaded = true;
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
_loaded = false;
base.OnNavigatedFrom(e);
}
|
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
Public Class DaySlotTemplateSelector
Inherits C1.Xaml.Calendar.DaySlotTemplateSelector
Public BoldedDays As New Dictionary(Of DateTime, String)()
Protected Overrides Function SelectTemplateCore(item As Object, container As DependencyObject) As DataTemplate
Dim slot As DaySlot = TryCast(item, DaySlot)
If slot IsNot Nothing AndAlso BoldedDays.ContainsKey(slot.[Date]) Then
' 日の DataTemplate に予定情報を表示できるようにタグに予定情報を格納します
slot.Tag = BoldedDays(slot.[Date])
Else
' 予定情報をクリアします
slot.Tag = Nothing
End If
If slot IsNot Nothing AndAlso Not slot.IsAdjacent AndAlso slot.DayOfWeek = DayOfWeek.Saturday Then
' 土曜日の色を設定します
DirectCast(container, Control).Foreground = New SolidColorBrush(Windows.UI.Color.FromArgb(255, 0, 90, 255))
End If
' 基本クラスでは、DaySlotTemplateSelector.Resources コレクション内に定義されたカスタム DataTemplate が選択されます(MainPage.xaml ファイルを参照)
Return MyBase.SelectTemplateCore(item, container)
End Function
End Class
Public Class SmallDaySlotTemplateSelector
Inherits C1.Xaml.Calendar.DaySlotTemplateSelector
Protected Overrides Function SelectTemplateCore(item As Object, container As DependencyObject) As DataTemplate
Dim slot As DaySlot = TryCast(item, DaySlot)
If slot IsNot Nothing AndAlso Not slot.IsAdjacent AndAlso slot.DayOfWeek = DayOfWeek.Saturday Then
' 土曜日の色を設定します
DirectCast(container, Control).Foreground = New SolidColorBrush(Windows.UI.Color.FromArgb(255, 0, 90, 255))
End If
' 基本クラスでは、DaySlotTemplateSelector.Resources コレクション内に定義されたカスタム DataTemplate が選択されます(MainPage.xaml ファイルを参照)
Return MyBase.SelectTemplateCore(item, container)
End Function
End Class
Public Class DayOfWeekTemplateSelector
Inherits DataTemplateSelector
Protected Overrides Function SelectTemplateCore(item As Object, container As DependencyObject) As DataTemplate
Dim slot As DayOfWeekSlot = TryCast(item, DayOfWeekSlot)
If slot IsNot Nothing AndAlso slot.DayOfWeek = DayOfWeek.Saturday Then
' 土曜日の色を設定します
DirectCast(container, Control).Foreground = New SolidColorBrush(Windows.UI.Color.FromArgb(255, 0, 90, 255))
End If
' DataTemplate を変更しないでください
Return Nothing
End Function
End Class
|
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
public class DaySlotTemplateSelector : C1.Xaml.Calendar.DaySlotTemplateSelector
{
public Dictionary BoldedDays = new Dictionary();
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
DaySlot slot = item as DaySlot;
if (slot != null && BoldedDays.ContainsKey(slot.Date))
{
// 日の DataTemplate に予定情報を表示できるようにタグに予定情報を格納します
slot.Tag = BoldedDays[slot.Date];
}
else
{
// 予定情報をクリアします
slot.Tag = null;
}
if (slot != null && !slot.IsAdjacent && slot.DayOfWeek == DayOfWeek.Saturday)
{
// 土曜日の色を設定します
((Control)container).Foreground = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 0, 90, 255));
}
// 基本クラスでは、DaySlotTemplateSelector.Resources コレクション内に定義されたカスタム DataTemplate が選択されます(MainPage.xaml ファイルを参照)
return base.SelectTemplateCore(item, container);
}
}
public class SmallDaySlotTemplateSelector : C1.Xaml.Calendar.DaySlotTemplateSelector
{
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
DaySlot slot = item as DaySlot;
if (slot != null && !slot.IsAdjacent && slot.DayOfWeek == DayOfWeek.Saturday)
{
// 土曜日の色を設定します
((Control)container).Foreground = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 0, 90, 255));
}
// 基本クラスでは、DaySlotTemplateSelector.Resources コレクション内に定義されたカスタム DataTemplate が選択されます(MainPage.xaml ファイルを参照)
return base.SelectTemplateCore(item, container);
}
}
public class DayOfWeekTemplateSelector : DataTemplateSelector
{
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
DayOfWeekSlot slot = item as DayOfWeekSlot;
if (slot != null && slot.DayOfWeek == DayOfWeek.Saturday)
{
// 土曜日の色を設定します
((Control)container).Foreground = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 0, 90, 255));
}
// DataTemplate を変更しないでください
return null;
}
}
|
|
次の「手順3:Calendar アプリケーションの実行」では、Calendar for UWP の機能について説明します。
ここまでの成果
これで、C1Calendar にデータを追加できました。次の手順では、実行時の動作をいくつか確認します。