精彩控件源码(2)-Farsi Library - Working with Dates, Calendars, and DatePickers

 http://www.codeproject.com/KB/selection/FarsiLibrary.aspx

Sample Image - Farsi Library Control

Introduction

The Persian Calendar is used in most countries where Persian is spoken, although some regions use different month names. The Persian calendar is the official calendar of Iran and Afghanistan, and is one of the alternative calendars in regions such as Kazakhstan and Tajikistan. The Persian calendar is based on a solar year and is approximately 365 days long. A year cycles through four seasons, and a new year begins when the sun appears to cross the equator from the southern hemisphere to the northern hemisphere as viewed from the center of the Earth. The new year marks the first day of the month of Farvardin, which is the first day of spring in the northern hemisphere.

Each of the first six months in the Persian calendar has 31 days, each of the next five months has 30 days, and the last month has 29 days in a common year and 30 days in a leap year. A leap year is a year that, when divided by 33, has a remainder of 1, 5, 9, 13, 17, 22, 26, or 30. For example, the year 1370 is a leap year because dividing it by 33 yields a remainder of 17. There are approximately 8 leap years in every 33-year cycle.

Since .NET Framework 1.0 and 1.1 does not provide any Persian Calendar, and Persian Calendar on .NET 2.0 has a bug and is useless, here, I'm going to show how to write the required DataType, and GUI controls to work with this DataType.

Persian Calendar Class

It seems that Microsoft forgot to provide a "Persian Calendar" on .NET 1.1, and while they do provide a class for this special kind of calendar in their second version of the Framework, they have somehow mis-calculated. We're going to write a Persian Calendar, plus a DataType to be replaced with the standard DateTime class, while maintaining the same structure. As it is required to convert standard DateTime to PersianDate, I'll be providing a converter class too. Since the use of these classes could be maximized when combined with GUI controls, I'll be providing a MonthView and a DatePicker control too.

Design-Time Integration

I've changed the design-time integration a little bit. Since some developers like to use PersianDate and others use DateTime classes to work with these libraries, I've exposed both of these properties as SelectedDate and SelectedDateTime. As for SelectedDate which has PersianDate type, there's a TypeConverter to do the conversion of Text to PersianDate instances at design time.

Theme Support

I'm using .NET 2.0 VisualStyleRenderer, which is a managed wrapper for XP styles. In addition, there are some classes to simulate Office 2003 rendering. There's also an Office 2000 style available. If theming is disabled or not supported by the OS, controls render using Office 2000 style.

Popup and Shadows

Popup controls should have shadows. On RTL controls, shadows should be at the left-bottom of the control. All the strings used in the controls are using a localizer manager class to get the strings based on StringID enumeration.To use the localized version you should change current thread's Culture and CultureUI properties to one of the defined cultures : (AR-SA for Arabic Culture, FA-IR for Persian Culture, and InvariantCulture for English or neutral culture. Here's how to do this in the application's Main() method:

Collapse Copy Code
//
// The main entry point for the application.
//
[STAThread]
static void Main()
{
    Thread.CurrentThread.CurrentUICulture =
            new System.Globalization.CultureInfo("fa-IR");
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

Here's the correct behavior of a popup control with standard strings and localized version for the FA-IR culture.

Using Arabic and Neutral Cultures

I primarily used AR-AE culture for Arabic, but in version 1.3.1.0, I had to change this to AR-SA. This is because of a problem (bug?) with the Hijri Calendar not being the default calendar of AR-AE culture, while it IS the default culture for AR-SA culture. Now the control is drawn in the correct way when you set the culture to Arabic.

Rendering in neutral culture is now done in Left-To-Right order. Generally the control decides to render in RTL or LTR based on the reading order of the current culture.

Using the Code

You can use the PersianDate class in much the same way as you use the DateTime class. Here are some examples:

Collapse Copy Code
//
// Use of Persian date class
//
PersianDate pd1 = PersianDate.Now.ToString(); // prints 1385/01/13
// constructs a new instance with the specified vales
PersianDate pd2 = new PersianDate(1386, 4, 26); 

// You can use operator overloading, too!
if(pd1 >= pd2)
   MessageBox.Show("Date is greater or equal");

// Use of normal DateTime and Conversion
PersianDate pd3 = PersianDateConverter.ToPersianDate(DateTime.Now);
DateTime dt1 = PersianDateConverter.ToGregorianDate(PersianDate.Now);

Points of Interest

Please send any suggestions/comments/feedbacks to my email address or use the Forum at the bottom of the page. For further releases or other libraries, visit my website.

.NET 1.1 and VisualStudio .NET 2003 Support

This library is tested on VS.NET 2005 and .NET Framework version 2.0. So, it won't run on VS.NET 2003. If you REALLY need to get this going, you'll have to port this to VS.NET 2003 and you'll have to change the drawing part of the code, since it actually uses managed classes of .NET 2.0 to draw in WindowsXP style. You'll have to use a wrapper on Theme API (there is already a project in CodeProject) to do the job for you. To make the porting easier, you can also cut out all the drawings in WindowsXP and Office 2003 style, and stick to the good-old Office2000 theme which uses GDI+ classes to draw.

WPF Version

The WPF version is out. You can have a look at the Vista (Windows Presentation Foundation) section of The Code Project website. Your feedbacks and comments are greatly appreciated.

History

Version 1.9.0.0

  • Fixed: Bugs regarding wrong mapping of Persian/Arabic weekdays and Gregorian weekdays, which resulted in wrong display of weekday in Gregorian calendar.
  • Added: Better handling of multi-selection mode. You can add/remove the SelectedDateRange property and changes will be reflected on the UI.
  • Added: PersianDayOfWeek enum with correct days order.
  • Added: DayOfWeek property to PersianDate class, to return the correct day of the week.

Version 1.6.0.0

  • Fixed: Some bugs posted through feedback.
  • Added: MessageBox control with RTL and LTR views, and ability to remember the selected value, with both standard and custom MessageBox buttons.
  • Added: Custom formatting of the PersianDate.ToString() method, (like the DateTime control), which gives the functionality to return formatted strings, e.g. Long Date, Long Time, DateTime, etc.
  • Added: Custom draw of each preferred day. Could be used to draw some days in disabled format, along with the SelectedDateTimeChanging event.

Version 1.5.0.0

  • Fixed: Exceptions of the FAMonthView control when selecting a date prior to MinValue and greater than MaxValue.
  • Fixed: Broadened the range of PersianDate MinValue and MaxValue classes.
  • Fixed: Invariant Culture's MonthNames is a zero-based index. First month's name is now okay in Invariant Culture.
  • Fixed: Checking of Year, Month, Day,... values on setting the property of the PersianDate.
  • Fixed: Checking of null values on != and == operators of PersianDate.
  • Fixed: Removed duplicate DateTime and PersianDate properties and events of the GUI controls. You can convert DateTime instances directly to PersianDate.
  • Fixed: Validation process of DatePicker.
  • Added: Complete two-way binding to any data source.
  • Added: Ability to use other cultures and calendars with the controls.
  • Added: Implicit conversion of DateTime and PersianDate.
  • Added: Added Millisecond property to PersianDate class for better precision.
  • Added: PersianDate class is now serializable and implements the following interfaces: ICloneable , IComparable , IComparable<T>, IComparer , IComparer<T>, IEquatable<T>.
  • Added: Ability to select scrolling feature of FAMonthView. You can scroll through days, months, or years.
  • Added: FAThemeManager class that handles selected themes of all controls. To change the theme globally, you just need to set this class' Theme property.
  • Added: FALocalizeManager class that handles other cultures. You can now localize strings into any culture.
  • Added: ToolStrip support. Now you can integrate controls in ToolStrip, MenuStrip, etc.
  • Added: Microsoft DataGridView custom column and editor support.

Version 1.4.0.0

  • Added: Complete test and demo of the functionalities provided with the library, with source code.
  • Added: Documentation
  • Added: Diagram for PopupForms, Controls hierarchy and Painter classes.
  • Implemented correct Office 2003 look and feel on ComboBox controls.
  • Implemented correct RTL and LTR views of FADatePickerConverter.
  • Bug Fix: FADa<code>tePicker control now displays the popup calendar according to its theme.
  • Bug Fix: Correct direction of popup controls in RTL and LTR mode.
  • Bug Fix: Correct Shadow location of popup controls in RTL and LTR mode.
  • Bug Fix: FADatePicker control not showing text property correctly.
  • Changes: Relocation of namespaces.
  • Known Issues : localization of strings in Arabic language. (anyone could give me a hand there?)

Version 1.3.1.0

  • Implementing Windows 2000 drawing on non-Windows XP computers or when the visual styles are disabled.
  • Better drawing of Windows XP and Office 2003 styles.
  • Drawing the control based on user's culture. Currently these cultures are allowed: Neutral (Gregorial Calendar), AR-SA (Hijri Calendar) and FA-IR (Persian Calendar).
  • Better localization. You can use Localizer class to update strings.
  • Support for Gregorian Calendar (Neutral Culture) and Hijri Calendar.
  • Rendering Left-To-Right for Cultures that are not Right-To-Left specific (e.g. Neutral Culture, English Culture, etc.)
  • New DatePickerConverter control which converts selected date by pressing a button.

Version 1

  • Providing base classes, and GUI controls to work with "Persian Dates". Some of the features (e.g. Office 2000 drawing) are not yet implemented.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Farsilibrary是一个很有意思的词语,它由两个部分组成:farsilibraryFarsi是指波斯语,而library则是图书馆的意思。因此,Farsilibrary可以被理解为波斯语图书馆,也许是某个国家或地区专门收藏波斯语书籍的图书馆。此外,也有可能是一个线上资源网站或者数字图书馆,为波斯语读者提供电子书籍资源的平台。 对于学习波斯语的人来说,Farsilibrary是个非常有用的资源。无论是在真实的图书馆里还是在线上,大量的波斯语书籍和文献都可以被找到,这些都能帮助学生更好地学习和掌握波斯语。 在历史上,波斯语文学曾经是世界文学的宝库之一。从诗歌到小说,从哲学到历史,波斯语文学的作品具有非常高的艺术性和文化含量。而Farsilibrary对于保存和传承这些作品,也起到了至关重要的作用。 总之,Farsilibrary是一个有关波斯语和文化的载体。它可以为我们了解波斯文化和历史提供很好的途径和资源,也是一个学习波斯语和增进交流的平台。 ### 回答2: FarsiLibrary是一个在线资源库,致力于为使用波斯语的人们提供丰富的学习和阅读资料。它不仅提供了大量的书籍、文章和课程,还有许多语言学习工具和辅助资料。 首先,FarsiLibrary收集了各种波斯语书籍,覆盖了从初学者到高级学习者的各个级别。这些书籍涵盖了波斯文学、历史、文化、诗歌等各个方面,使用户能够通过阅读来提高自己的波斯语水平,同时也能了解波斯文化的丰富内涵。 其次,FarsiLibrary提供了一系列的文章和资讯,涉及了时事、新闻、经济、科技等各个领域。这些文章既可以帮助用户扩展词汇量,提高阅读能力,也可以帮助用户了解当代波斯社会的动态和变化。 此外,FarsiLibrary还提供了波斯语学习工具和辅助资料,如词典、语法学习资源等。这些工具和资料能够帮助用户更好地理解和掌握波斯语的语法规则和词汇。 总之,FarsiLibrary是一个非常有价值的波斯语学习和阅读资源库。它为波斯语学习者提供了各种级别的书籍、文章和资讯,同时也提供了学习工具和辅助资料,帮助用户提高自己的波斯语水平。无论是初学者还是高级学习者,都能在FarsiLibrary中找到适合自己的资源,实现自己的学习目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值