PersianDateTimeWPFTools 1.3.0
dotnet add package PersianDateTimeWPFTools --version 1.3.0
NuGet\Install-Package PersianDateTimeWPFTools -Version 1.3.0
<PackageReference Include="PersianDateTimeWPFTools" Version="1.3.0" />
<PackageVersion Include="PersianDateTimeWPFTools" Version="1.3.0" />
<PackageReference Include="PersianDateTimeWPFTools" />
paket add PersianDateTimeWPFTools --version 1.3.0
#r "nuget: PersianDateTimeWPFTools, 1.3.0"
#:package PersianDateTimeWPFTools@1.3.0
#addin nuget:?package=PersianDateTimeWPFTools&version=1.3.0
#tool nuget:?package=PersianDateTimeWPFTools&version=1.3.0
Persian calendar
WPF calendar with support for Gregorian and solar calendars
- A free Persian calendar with the ability to support the Gregorian calendar that can be used in WPF
- You can write any style you like for the controls.
- Language change support and other resources
Please see the test project for further guidance.
Controls
- Clock

- PersianCalendar

- PersianDatePicker

- PersianDateTimePicker

- PersianCalendarWithClock

You can manually change the Culture of the control using the following code in XAML or C#.
XAML
CustomCultureName="fa-IR"
C#
pcwc1.CustomCulture = CultureInfo.CreateSpecificCulture("en-US");
If you do not select Culture, it will be automatically selected based on the software's Culture.
⚙️How to use?
Step 1: Add the following resources in the App.xaml file
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pdtt="https://github.com/Behnam2064/PersianDateTimeWPFTools"
>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<pdtt:InitResources />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Step 2: Use in XAML (WPF) files You can use below namespace in xaml (wpf)
xmlns:pdtt="https://github.com/Behnam2064/PersianDateTimeWPFTools"
Sample:
<Window
xmlns:pdtt="https://github.com/Behnam2064/PersianDateTimeWPFTools">
<Grid>
<pdtt:PersianCalendar />
</Grid>
</Window>
Ability to write custom styles for all controls

Dependency Properties
New Dependency Properties
| Name | Description | Default |
|---|---|---|
| CustomCulture | Selecting a different culture than the current software culture | Based on the current software culture |
| CustomCultureName | Choosing a culture name that is different from the current software culture (such as fa-IR or en-US) | Based on the current software culture |
| AllowSelectBlackedOutDay | Selectable holidays | False |
| ShowTodayButton | Show a button to move to the current day | False |
| ShowConfirmButton | Show a button to display confirm button | False |
| DisplayDate | Displays the current date | ? |
| DisplayDateStart | Start displaying the date | ? |
| DisplayDateEnd | End of displaying date | ? |
| DisplayMode | Date display type (like Month,Year,Decade) | Month |
| FirstDayOfWeek | First day of the week | Sunday |
| SelectionMode | Type of selection | SingleDate |
| IsTodayHighlighted | Show current day as highlights | True |
| ✨ DayMetadata | Introduce DayMetadata API for unified per-day customization such as Tooltip, DayIndicators, DayIndicatorStyle, etc. | |
| ✨ DayToolTips | Show Tooltip for calendar days | |
| ✨ DayToolTipTemplate | A template for a tooltip | |
| ✨ DayIndicators | Display Indicator for calendar days | |
| ✨ DayIndicatorStyle | A style for the Indicator |
❔ What is DayMetadata?

introduce DayMetadata API for unified per-day customization
- Added CalendarDayInfo model to describe per-day metadata
- Introduced DayMetadata dictionary to centralize day configuration
- Unified tooltip, indicator, and disabled-day logic under a single API
- Ensured backward compatibility with existing DayToolTips and DayIndicators
- Enabled tooltips to be shown on disabled days for better UX
- Implemented virtualization-safe updates across month navigation
📝 A note about the DayMetadata execution priority
DayMetadata
↓
DayToolTips / DayIndicators
↓
Default behavior
⚙️How to use DayMetadata?
First you need to familiarize yourself with the properties of the CalendarDayInfo class.
| Name | Description | Default |
|---|---|---|
| ToolTip | Show Tooltip for calendar days | |
| ToolTipTemplate | A template for a tooltip. | |
| HasIndicator | Display Indicator for calendar days | False |
| IndicatorStyle | A style for the Indicator (You can create a unique style for each day.) | |
| IsDisabled | Disable specific day | False |
| ShowToolTipWhenDisabled | Show Tooltip for disabled days | True |
C#
persianCalendar.DayMetadata = new Dictionary<DateTime, CalendarDayInfo>
{
[new DateTime(2025, 12, 29)] = new CalendarDayInfo
{
ToolTip = "Meeting with the marketing team",
},
[new DateTime(2025, 12, 31)] = new CalendarDayInfo
{
ToolTip = "Important meeting with the development team",
HasIndicator = true,
IndicatorStyle = Resources["DayIndicatorRedStyle"] as Style,
},
[new DateTime(2025, 12, 21)] = new CalendarDayInfo
{
ToolTip = "My love's birthday",
HasIndicator = true,
IsDisabled = true,
ShowToolTipWhenDisabled = true,
IndicatorStyle = this.Resources["DayIndicatorGreenStyle"] as Style,
ToolTipTemplate = Resources["FancyDayToolTipTemplate"] as DataTemplate,
}
};
✨Tip 1
The DateTime object should only contain dates.
✨Tip 2
If you want to update DayMetadata you need to do something like the following
var preDayMetadata = persianCalendar.DayMetadata;
preDayMetadata.Add(DateTime.Today.AddDays(2), new CalendarDayInfo() { ToolTip = "Don't forget about renting a house.", HasIndicator = true });
persianCalendar.DayMetadata = preDayMetadata;
💫Creating a Style for the Day Indicator
<Style
x:Key="DayIndicatorRedStyle"
TargetType="Ellipse">
<Setter
Property="Width"
Value="10" />
<Setter
Property="Height"
Value="10" />
<Setter
Property="Fill"
Value="Red" />
<Setter
Property="VerticalAlignment"
Value="Top" />
<Setter
Property="HorizontalAlignment"
Value="Right" />
<Setter
Property="Margin"
Value="2,2,2,4" />
</Style>
⚙️How to use Day ToolTips?

C#
persianCalendar.DayToolTips = new Dictionary<DateTime, object>
{
{ DateTime.Today,"It is today."},
{ DateTime.Today.AddDays(1),"It is tomorrow."},
};
✨Tip 1
The DateTime object should only contain dates.
✨Tip 2
If you want to update Day ToolTips you need to do something like the following
var preTooltips = persianCalendar.DayToolTips;
preTooltips.Add(DateTime.Today.AddDays(2), "Important business meeting");
persianCalendar.DayToolTips = preTooltips;
You can also create a Template for Day Tooltip.
XAML
<DataTemplate
x:Key="FancyDayToolTipTemplate">
<Border
Background="#222"
Padding="8"
CornerRadius="6">
<StackPanel>
<TextBlock
Text="{Binding}"
Foreground="White"
FontWeight="Bold" />
<TextBlock
Text="More..."
Foreground="LightGray"
FontSize="11" />
</StackPanel>
</Border>
</DataTemplate>
And in your control
DayToolTipTemplate="{StaticResource FancyDayToolTipTemplate}"
⚙️How to use Day Indicators?

C#
persianCalendar.DayIndicators = new Dictionary<DateTime, bool>
{
[new DateTime(2025, 12, 23)] = true,
[new DateTime(2025, 12, 25)] = true
};
✨Tip 1
The DateTime object should only contain dates.
✨Tip 2
If you want to update Day Indicators you need to do something like the following
var preDayIndicators = persianCalendar.DayIndicators;
preDayIndicators.Add(DateTime.Today.AddDays(2), true);
persianCalendar.DayIndicators = preDayIndicators;
You can also create a Style for Day Indicators.
<Style
x:Key="RedDotIndicatorStyle"
TargetType="Ellipse">
<Setter
Property="HorizontalAlignment"
Value="Right" />
<Setter
Property="VerticalAlignment"
Value="Top" />
<Setter
Property="Width"
Value="10" />
<Setter
Property="Height"
Value="10" />
<Setter
Property="Fill"
Value="Red" />
</Style>
And in your control
DayIndicatorStyle="{StaticResource RedDotIndicatorStyle}"
⚙️How to change the theme
In the App.xaml file, you can select one of the following themes by selecting the SelectedTheme property in the InitResources class.
- Default
- DarkModern1
- LightModern1
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pdtt="https://github.com/Behnam2064/PersianDateTimeWPFTools"
>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<pdtt:InitResources
SelectedTheme="LightModern1"
/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
⚙️How to change theme in C#
You can do the following in the constructor of the App.xaml.cs class:
public partial class App : Application
{
public App()
{
var init = new InitResources();
init.SelectedTheme = PersianDateTimeWPFTools.Themes.BaseThemeName.DarkModern1;
}
}
or
public partial class App : Application
{
public App()
{
InitResources.SetTheme(new ThemeDarkModern1());
}
}
⚙️How to change the control language?
public partial class App : Application
{
public App()
{
new InitResources()
.ChangeLanguage("fa"); // en
}
}
⚙️How to change the language of controls with our own resources
To read the language resources, please visit the link below. Github Link
public partial class App : Application
{
public App()
{
new InitResources()
.ChangeLanguage(null, "pack://application:,,,/TestPersianCalendar;component/Lang.es.xaml"); // Your resource address
}
}
The next feature could be new themes 💫
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0-windows7.0 is compatible. net7.0-windows was computed. net7.0-windows7.0 is compatible. net8.0-windows was computed. net8.0-windows7.0 is compatible. net9.0-windows was computed. net10.0-windows was computed. |
| .NET Framework | net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
-
.NETFramework 4.6.1
- No dependencies.
-
net6.0-windows7.0
- No dependencies.
-
net7.0-windows7.0
- No dependencies.
-
net8.0-windows7.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.3.0 | 83 | 12/30/2025 |
| 1.2.0.2 | 95 | 12/26/2025 |
| 1.2.0.1 | 163 | 12/24/2025 |
| 1.0.6.3 | 375 | 5/11/2025 |
| 1.0.5.1 | 158 | 4/12/2025 |
| 1.0.5 | 221 | 4/10/2025 |
| 1.0.4.2 | 145 | 4/5/2025 |
| 1.0.3 | 197 | 4/4/2025 |
| 1.0.0.8 | 233 | 4/3/2025 |
| 1.0.0.7 | 202 | 3/30/2025 |
| 1.0.0.6 | 197 | 3/30/2025 |
| 1.0.0.5 | 561 | 3/25/2025 |
| 1.0.0.4 | 211 | 3/19/2025 |
✨ New Feature: DayMetadata (Unified Per-Day Customization)
This release introduces a new DayMetadata API that allows full control over individual calendar days using a single, unified model.
Key highlights:
- New CalendarDayInfo model for describing per-day behavior
- Centralized configuration for tooltips, indicators, and disabled days
- Backward-compatible with existing DayToolTips and DayIndicators APIs
- Tooltips can be displayed even on disabled days to explain restrictions
- Virtualization-safe implementation ensures correct behavior when navigating between months
- Fully styleable and MVVM-friendly design
This enhancement makes advanced day-level customization cleaner, more expressive, and easier to maintain.