همانطور که اطلاع دارید، کنترلهای Calendar و DatePicker در WPF، از تقویمهای مختلف پشتیبانی نمیکنند و نمونههایی که در سطح اینترنت موجود است، ظاهر و استایل مناسبی ندارند. بنابر این تصمیم گرفتم تا خودم دست به کار شوم و این کمبود را حل کنم. نتیجهی آن شد کتابخانهی
که بصورت استاندارد تقویم شمسی را به کنترلهای Calendar و DatePicker اضافه میکند و استایلهای زیبایی را هم به همراه خود دارد. این کتابخانه شامل تمام مناسبتهای شمسی، قمری و میلادی بوده و امکان نمایش روزهای تعطیل را نیز داراست.
همچنین پرشین تولکیت شامل توابع قدرتمندی جهت دریافت تاریخ بصورت شمسی، قمری و میلادی است. لازم به ذکر است که توابع محاسبه تاریخ قمری بسیار دقیق بوده و خطای بسیار کمی دارد. علاوه بر موارد گفته شده، پرشین تولکیت شامل استایلها و براشهای پیشفرض متنوعی میباشد که کاربر میتواند با توجه به سلیقهی خویش، رنگ بندی تقویم را تغییر دهد.
پرشین تولکیت در 3 استایل مختلف موجود است که بصورت Runtime هم قابلیت تغییر استایل را دارد (روشن، تاریک، بنفش):
نحوهی نصب و استفاده
ابتدا پرشین تولکیت را از نیوگت نصب کنید:
Install-Package PersianToolkit
سپس منابع برنامه را در فایل App.xaml بارگزاری کنید:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/PersianToolkit;component/Themes/SkinDefault.xaml"/>
<ResourceDictionary Source="pack://application:,,,/PersianToolkit;component/Themes/Theme.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
در هر کجا که نیاز به تقویم دارید ابتدا فضای نام برنامه را فراخوانی کنید سپس از اجزای آن استفاده کنید
xmlns:pc="http://github.com/ghost1372/PersianToolkit"
<pc:Calendar/>
<pc:DatePicker/>
تغییر پوسته برنامه
پرشین تولکیت شامل 3 پوسته پیشفرض است که میتوانید به راحتی در زمان اجرا، پوسته برنامه را تغییر دهید. قبل از آن نیاز است تا تابع تغییر پوسته را پیاده سازی کنید:
internal void UpdateSkin(SkinType skin)
{
ResourceDictionary skins0 = Resources.MergedDictionaries[0];
skins0.MergedDictionaries.Clear();
skins0.MergedDictionaries.Add(ResourceHelper.GetSkin(skin));
skins0.MergedDictionaries.Add(new ResourceDictionary
{
Source = new Uri("pack://application:,,,/PersianToolkit;component/Themes/Theme.xaml")
});
Current.MainWindow?.OnApplyTemplate();
}
ورودی تابع از نوع SkinType میباشد که شامل Dark, Violet و Default است:
UpdateSkin(SkinType.Violet);
تغییر تقویم به حالت میلادی یا شمسی
برای تغییر نوع تقویم میتوانید از کلاس ConfigHelper استفاده کنید (به صورت پیشفرض تقویم شمسی فعال است و نیازی به تغییر تقویم به شمسی نیست):
ConfigHelper.Instance.SetLanguage(ConfigHelper.Language.Persian);
نکته: فقط یکبار آن هم در زمان شروع شدن برنامه میتوانید نوع تقویم را تغییر دهید. در زمان اجرا نمیتوانید نوع تقویم را تغییر دهید.
گزینههای موجود
ShowHoliday :مناسبتها
جهت نمایش مناسبتها و روزهای تعطیل بر روی تقویم، میتوانید آن را فعال کنید:
<pc:Calendar pc:Holiday.ShowHoliday="True"/>
رنگها : روز جاری، روز انتخاب شده، روزهای تعطیل، کادر مناسبتها
شما میتوانید براحتی رنگ روز فعلی، روز انتخاب شده و روزهای تعطیل را تغییر دهید:
<pc:Calendar pc:ColorStyle.HolidayDayBrush="{DynamicResource SuccessBrush}"
pc:ColorStyle.SelectedDateBrush="{DynamicResource WarningBrush}"
pc:ColorStyle.TodayDateBrush="{DynamicResource InfoBrush}"/>
بصورت پیشفرض رنگهای زیر موجود است و با نوشتن آنها میتوانید از رنگهای پیشفرض استفاده کنید:
PrimaryBrush
SuccessBrush
InfoBrush
DangerBrush
WarningBrush
AccentBrush
برای تغییر رنگ کادر عنوان مناسبتها باید از پراپرتی HolidayContentStyle استفاده کنید. دقت کنید که این پراپرتی ورودی از نوع Style را برای کنترل Label دریافت میکند. بصورت پیشفرض استایلهای زیر موجود است:
<pc:Calendar pc:ColorStyle.HolidayContentStyle="{StaticResource LabelPrimary}"/>
LabelDefault
LabelPrimary
LabelSuccess
LabelInfo
LabelDanger
LabelWarning
تغییر رنگها و استایل به وسیله کدهای سی شارپ
شما میتوانید رنگها و استایلهای موجود را با سی شارپ هم تغییر دهید برای این منظور وارد کلاس ColorStyle شوید و پراپرتی موردنظر را انتخاب کنید و مقدار دلخواه را تنظیم کنید. برای سادگی کار، استایلها و رنگهای پیشفرض توسط کلاس ResourceHelper و ResourceBrushToken یا ResourceHolidayContentStyleToken قابل دسترسی هستند.
ColorStyle.SetHolidayDayBrush(pc, ResourceHelper.GetResource<Brush>(ResourceBrushToken.SuccessBrush));
ColorStyle.SetHolidayContentStyle(pc, ResourceHelper.GetResource<Style>(ResourceHolidayContentStyleToken.LabelPrimary));