عنوان:

‫سیلورلایت 5 و تاریخ شمسی


نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۰۳/۲۸ ۱۶:۴۲
آدرس: www.dntips.ir
از سیلورلایت 5 به بعد، پشتیبانی توکاری از تاریخ شمسی نیز اضافه شده است و من هم کنترل date picker ایی را که برای سیلورلایت 4 درست کرده بودم به این نگارش ارتقاء داده و کلاس تقویم فارسی سفارشی آن‌را با نمونه موجود جایگزین کردم. این تغییرات به خوبی بر روی سیستم من جواب داد و مشکلی نبود؛ تا اینکه یکی از استفاده کنندگان از این کنترل، خطای زیر را بر روی بعضی از کامپیوترهای استفاده کننده، گزارش داد:
Specified time is not supported in this calendar.
It should be between 04/30/1900 00:00:00 (Gregorian date) and 05/13/2029 23:59:59 (Gregorian date), inclusive.
Parameter name: time

به نظر تنظیمات خاص محلی بعضی از این سیستم‌ها سبب بروز این مشکل شده است. برای رفع آن کافی است تغییرات زیر اعمال شوند:

الف) در فایل web.config برنامه یک سطر زیر را اضافه نمائید:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="fa-IR" uiCulture="fa-IR"/>

ب) در Application_Startup برنامه سیلورلایت خود تنظیمات زیر را اعمال کنید:
Thread.CurrentThread.CurrentCulture = new CultureInfo("fa-IR");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fa-IR");

با این تغییرات صرفنظر از تنظیمات محلی کاربر یا سرور مورد استفاده، تقویم شمسی سیلورلایت 5 بدون مشکل در دسترس خواهد بود.
 

نظرات

  • مهمان در ۱۳۹۱/۰۳/۲۸ ۱۷:۵۷
    آقای نصیری. آیا من که تا الان سمت سیلورلایت نرفتم با توجه به صحبت هایی که داره میشه مبنی بر اینکه به زودی سیلورلایت منسوخ میشه و اینکه خود مایکروسافت هم قصد داره بیشتر سرمایه ش رو بزاره رو HTML5 آیا کار درستیه که وقت بزارم برای یادگیری این تکنولوژی یا خیر ؟ ممنون میشم پاسخ بدید ؟
    • وحید نصیری در ۱۳۹۱/۰۳/۲۸ ۱۸:۱۹
      پایه و اساس طراحی سیلورلایت، WPF و WinRT در ویندوز 8 یکی است.
      بنابراین از یادگیری سیلورلایت هیچ ضرری نخواهید کرد؛ حتی اگر مستقیما از آن استفاده نکنید. برای مثال کسی که با سیلورلایت آشنا هست راحت می‌تونه به WinRT ویندوز 8 کوچ کنه چون در ویندوز 8 برنامه نویسی برای WinRT «با» دات نت فقط به استفاده از XAML و یکی از زبان‌های دات نتی خلاصه میشه. البته امکان استفاده از HTML خاص WinRT هم هست (که انتقال پذیر نیست و مخصوص کار با زیرساخت‌های WinRT یک سری اضافاتی رو داره) ولی کار با دات نت در این ویندوز برای تولید برنامه‌های مترو، پایه و اساسش همین سیلورلایت و WPF است.
      من یک دوره WinRT رو زیرنویس دار کردم (^ ). نکته مهمش این است که در سراسر دوره عمده بحث بررسی تفاوت‌های WinRT با سیلورلایت و WPF است. یعنی اساس یکی است و چیزی دور ریخته نشده. فقط یک سری موارد کم شده چند کنترل زیاد شده، یک سری مباحث برنامه نویسی غیرهمزمان به آن اضافه شده و از این مباحث.
  • مسعود مشهدی در ۱۳۹۱/۰۳/۲۹ ۰:۲۰
    سلام جناب نصیری
    من تو پروژه سیلور از OData استفاده کردم. وقتی می خواستم Max یک ستون رو برگردونم با پیغام زیر مواجه شدم.
    .NotSupportedException: The method 'Max' is not supported
    ظاهرا بعضی از متدها موقع کوئری نوشتن (LINQ to Entities) با OData و WCF سازگار نیستن و ساپورت نمیشوند.(البته تا جایی که من سرچ کردم و یه چیزایی فهمیدم).
    This topic provides information about the way in which LINQ queries are composed and executed when you are using the WCF Data Services client and limitations of using LINQ to query a data service that implements the Open Data Protocol (OData). For more information about composing and executing queries against an OData-based data service, see Querying the Data Service (WCF Data Services).
    Composing LINQ Queries
    LINQ enables you to compose queries against a collection of objects that implements IEnumerable. Both the Add Service Reference dialog box in Visual Studio and the DataSvcUtil.exe tool are used to generate a representation of an OData service as an entity container class that inherits from DataServiceContext, as well as objects that represent the entities returned in feeds. These tools also generate properties on the entity container class for the collections that are exposed as feeds by the service. Each of these properties of the class that encapsulates the data service return a DataServiceQuery. Because the DataServiceQuery class implements the IQueryable interface defined by LINQ, the WCF Data Services you can compose a LINQ query against feeds exposed by the data service, which are translated by the client library into a query request URI that is sent to the data service on execution.
     Note:
    The set of queries expressible in the LINQ syntax is broader than those enabled in the URI syntax that is used by OData data services. A NotSupportedException is raised when the query cannot be mapped to a URI in the target data service. For more information, see the Unsupported LINQ Methods in this topic.
    
    لطفا اگر امکانش هست راهنمائی بفرمائید و اینکه حالا که ساپورت نمیشه چه راه حلی وجود داره برای Max گرفتن.
    با تشکر

    • وحید نصیری در ۱۳۹۱/۰۳/۲۹ ۰:۴۲
      موضوع بحث کاملا مشخص است. تاریخ شمسی و سیلورلایت 5.
      یافتن Max با LINQ یک نکته انحرافی هم دارد. زمانیکه شما OrderByDescending را فراخوانی کنید و سپس Take اولین المان لیست، به همان Max می‌‌رسید.
      var max = query.OrderByDescending(...) .Take(1);

      • مسعود مشهدی در ۱۳۹۱/۰۳/۲۹ ۱۱:۳
        با سلام و تشکر
        جناب نصیری این مورد رو هم قبلا چک کردم که با پیغام خطای زیر مواجه شدم
        Silverlight does not enable you to directly enumerate over a data service query.
        This is because enumeration automatically send a synchronous request to the data service.
        Because Silverlight only supports  asynchronous operations, you must instead call BeginExecute and EndExecute method to obtain a query result that supports enumeration. 
        • وحید نصیری در ۱۳۹۱/۰۳/۲۹ ۱۱:۵۱
          شما این کد رو باید Async اجرا کنید (با استفاده از BeginExecute/EndExecute). نحوه انجام کار با مثال در اینجا توضیح داده شده.
  • مهمان در ۱۳۹۱/۰۳/۲۹ ۱:۲۴
    با سلام و تبریک بخاطر قالب جدید
    من تازه با سایت عالی شما آشنا شدم و از مطالب پیشرفته و به روزی که با زبان ساده میگذارید خیلی استفاده کردم.
    اگر امکان داره در مورد برنامه نویسی ماجولار هم مطلب بگذارید.
    متشکرم 
  • مهمان در ۱۳۹۱/۰۳/۲۹ ۱۵:۱۶
    سلام.
    جناب نصیری، من توی ساپورت و کانکت ماکروسافت، جایی برای ارسال درخواست درباره اضافه شدن تقویم فارسی به datepicker مترو استایل، پیدا نکردم، درخواست راهنمایی از طرف شما را دارم: http://msdn.microsoft.com/en-US/library/windows/apps/hh465480 
    • وحید نصیری در ۱۳۹۱/۰۳/۲۹ ۱۶:۲۴
      باید انجمن user voice مربوطه رو پیدا کنید. مثلا این مورد: (^)
  • مهمان در ۱۳۹۱/۰۵/۰۷ ۱۸:۴۵
    سلام استاد. امکان اضافه کردن این مورد به این کنترل هست که کاربر هم بتواند تاریخ را در TextBox وارد کند؟آخه در خیلی از برنامه‌ها کاربران عادت دارن که بیشتر از صفحه کلید استفاده کنند. ممنون میشم اگر برای شما مقدور باشد این قابلیت را نیز اضافه کنید 
    • وحید نصیری در ۱۳۹۱/۰۵/۰۷ ۱۸:۴۷
      آخرین نگارش آن این قابلیت را دارد که بتوان در جعبه متنی آن تاریخ وارد کرد.
      +
      لطفا از قسمت discussions همان سایت codeplex برای طرح این مسایل مرتبط با پروژه‌ای خاص استفاده نمائید.