標籤:void sof tco event rgs order none pen init
原文:WPF月視圖控制項
簡介
在做一個應用時,需要做成日曆月視圖的形式。自己做較麻煩,於是上網找找看,在CodeProject上發現了這個Quick and Simple WPF Month-view Calendar,可是程式的後台是用VB寫成的。雖然我不會寫VB,但是閱讀也能懂個八九不離十。於是將其改寫為C#,做了些改進,使其更通用。如下:
使用方式較簡單,在XAML中聲明,然後在代碼中使用。支援在定義自每天事項介面和雙擊事件。
XAML聲明:
<Window x:Class="MonthViewTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:monthControl="clr-namespace:MonthView.Controls;assembly=MonthView" Title="MainWindow" Width="800" Height="600"> <monthControl:MonthControl x:Name="TestMonthControl" /></Window>
後台代碼使用:
using MonthView.EventArgs;using System.Windows;namespace MonthViewTest{ /// <summary> /// MainWindow.xaml 的互動邏輯 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //事項源 TestMonthControl.DateTimeEvents = DiaryCache.Diaries; //事項介面工廠 TestMonthControl.DateTimeEventControlFactory=new DiaryBreifControlFactory(); TestMonthControl.DayBlankDoubleClicked += AddNewDiary; } /// <summary> /// 日期控制項雙擊的處理 /// </summary> /// <param name="e"></param> private void AddNewDiary(DayEventArgs e) { var diary = new Diary { HappenTime = e.DayTime, }; var wnd = new DiaryWindow { Diary = diary, Title="添加日記", Owner = Application.Current.MainWindow }; if (true == wnd.ShowDialog()) { DiaryCache.Diaries.Add(wnd.Diary); } } }}原理
代碼結構如下:
核心代碼位於DayControl中。構建介面過程如下:利用System.Globalization.Calendar計算出月份的總天數,再根據當月第一天為星期幾計算出總共的周數。將相應周數的周控制項加入到月控制項,再依次將一個月中每天對應的天控制項放入其對應的周控制項。
缺點:事項列表需一次性載入到記憶體中,可修改代碼利用委託按需載入。控制項不支援泛型,如果不需要在XAML中使用,可修改代碼使其支援泛型。
代碼
部落格園:WPFMonthView。
GitHub:WPFMonthView。
WPF月視圖控制項