جستجو در تالار

در حال نمایش نتایج برای برچسب های 'آموزش'.



تنظیمات بیشتر جستجو

  • جستجو بر اساس برچسب

    برچسب ها را با , از یکدیگر جدا نمایید.
  • جستجو بر اساس نویسنده

نوع محتوا


تالار ها

  • عمومی
    • اطلاعیه
    • اخبار
    • پیشنهادها و انتقادات
    • درخواست آموزش
    • مشکلات و مسائل انجمن
    • متفرقه
  • سوالات، مشکلات و درخواست
    • ویندوز استور
    • وب (ASP.Net)
    • ویندوز دسکتاپ (Win32 & WPF)
    • زامارین فرم (Xamarin.Forms)
    • زامارین اندروید
    • زامارین iOS
    • دات نت کور
    • اینترنت اشیاء (IOT)
    • سوالات کلی و عمومی
  • توسعه نرم افزارهای ویندوز استور
    • سوالات، مشکلات پروژه های ویندوز استور
    • مقالات، کتاب ها و منابع آموزشی
    • سورس کدهای آموزشی
  • برنامه نویسی زامارین
    • زامارین فرم (Xamarin.Forms)
    • زامارین ios
    • زامارین اندروید
    • عمومی
  • برنامه نویسی ASP.NET
    • مقالات، کتاب ها و منابع آموزشی
    • .Net Core
    • ASP.NET MVC
    • ASP.NET WebForm
  • اینترنت اشیاء
    • مقالات، کتاب ها و منابع آموزشی
    • سخت افزار
    • نرم افزار
    • پروژه ها
  • متفرقه
    • آموزش ابزارها و نرم افزار ها
    • آموزش های سرویس ها و سایت ها
    • سوالات و مشکلات برنامه نویسی Win 32
  • نرم افزار
    • نرم افزار های تیم انجمن
    • نرم افزار های ساخت شما
    • سفارش نرم افزار و برنامه نویسی
    • معرفی ابزارها و نرم افزارهای مرتبط
    • درخواست ابزار کمکی
    • مشکلات و سوالات در مورد نرم افزار ها

گروه


آدرس تارنما


یاهو


اسکایپ


حساب مایکروسافت


شماره تماس


تلگرام


مکان


علایق


نام توسعه دهندگی

35 نتیجه پیدا شد

  1. سلام؛ برد Uno یکی از محبوب ترین بردهایی است که تولید شده و البته همانطور که از نامش پیداست (UNO در ایتالیایی یعنی عدد یک) آغازگر انقلاب آردوئینو بوده است. بردی ارزان (حدود 20 هزار تومان) که بر پایه mega328 توسعه یافته و بر همین اساس امکانات خوبی را برای ما فراهم می کند: 14 پین برای ورود و خروج اطلاعات که 6 تا از آنها به عنوان pwm نیز قابل استفاده هستند یک مزیت برای هر کاربری است که تعداد زیادی ورودی و خروجی در مدار خود دارد. وجود پورت USB از نوع مینی علاوه بر آسان کردن پروگرام این برد، تغذیه آن را هم از طریق طیف وسیعی از منبع تغذیه های موجود در بازار (شارژر موبایل!) امکان پذیر کرده است. البته جک مادگی ضخیم شارژ همچنان بر روی این برد قابل مشاهده است، تا در صورت نیاز به درگاه USB بتوانید همچنان برد را تغذیه کنید. پین هدرISCP و کلید ریسیت هم از سایر چیزهایی است که در این برد وجود دارد. برای راه اندازی این برد به صورت پایدار به اختلاف پتانسیل مابین 6 تا 20 ولت نیاز دارید، البته اگر ولتاژ را به بیش از 12 ولت برسانید، به علت افزایش دمای چیپ بهتر است از یک سینک یا خنک کننده دیگر استفاده کنید. بهتر است بگوییم بهترین بازه عملیاتی این برد در ولتاژ 7 تا 12 ولت قرار دارد. حافظه این برد 32 کیلوبایت هست که کاملا کافی به نظر می رسد! 2 کیلوبایت SRAM و 1 کیلو بایت EEPROM هم در اختیار شماست (البته من نمی دونم دقیقا کاربردشون چیه!). در آخر هم خوب است بدانید که با دو پین RX و TX می توانید از ماژول های رادیویی مثل بلوتوث هم استفاده کنید!
  2. سلام؛ احتمالا برای شما هم این سوال پیش آمده باشد که چه زمانی باید از بردهای رسپبری پای و چه زمانی از بردهای (یا ماژول‌های) آردوئینو استفاده کرد. با این که این یک قانون نیست اما در کلیت می‌تواند راهگشا باشد. هر گاه نیاز بر این باشد که شما اطلاعاتی را از محیط دریافت کنید یا کاری بر روی سیستم انجام دهید، بهتر است از بردهای آردوئینو و ماژول‌های آن استفاده کنید. و هر گاه نیاز به پردازش این اطلاعات دارید یا می‌خواهید دستورات پیچیده‌ای برای اعمال به بردهای آردوئینو بدهید، باید از رسپبری پای یا سایر بردهای دارای سیستم عامل استفاده کنید. البته واضح هست که برد رسپبری پای خود می‌تواند به وسیله سنسور، برخی از اطلاعات را دریافت کند، اما ماژول‌های موجود برای بردهای آردوئینو بسیار گسترده تر و ارزانتر هستند. همچنین باید به این نکته هم توجه کرد که گوشی موبایل هم می‌تواند تبدیل به واحد پردازشی سیستم ما شود. پس با رسپبری پای تمام اطلاعات را از آردوئینو دریافت و پردازش کنید.
  3. با سلام در این آموزش با مقدمات برنامه نویسی کراس پلتفرم (مالتی پلتفرم) با استفاده از Xamarin.Forms در خدمت شما هستم . فرض این آموزش بر این هست که شما برنامه نویسی به زبان سی شارپ (C# .Net) را از پیش فرا گرفته اید و آشنایی حداقلی با HTML یا XAML دارید . بنا به دلیل اینکه منابع موجود برای پرسش و پاسخ از Xamarin کمتر از منابع موجود برای Native پلتفرم ها میباشد ابتدا حتماً بر روی یکی از زبان های مبتنی بر سی شارپ تسلط داشته باشید . به دلیل شباهت بیشتر ترجیحاً یکی از این زبان ها / سیستم عامل ها را انتخاب کنید : UWP / WPF / Windows Phone Silverlight / Windows Runtime در این آموزش از Visual Studio 2017 و شبیه ساز اندروید مایکروسافت استفاده شده است . در قسمت اول آموزش به سراغ تنظیم امولاتور خواهیم رفت تا شبیه ساز دسترسی به اینترنت داشته باشد و پس آن به آموزش خواهیم پرداخت . امیدوارم که این آموزش مورد توجهتون قرار بگیره . » پیوند های مرتبط « آموزش نصب و راه اندازی زامارین با شبیه ساز مک آموزش تنظیم Visual Studio Emulator for Android جهت دسترسی به اینترنت (پست شماره #2 همین مطلب)
  4. سلام؛ داشتن یک کیبورد اختصاصی می تواند برای خیلی ها مفید و کارآمد باشد، کیبوردی که تنها برای یک عملیات یا برنامه خاص، فعالیت شما را ساده تر و حرفه ای تر می کند، یک کیبورد مخصوص بازی، کیبورد پخش چند رسانه ای، کیبورد برای کنترل رسپبری پای و یا حتی یک کلید برای تایپ ; در محیط ویژوال استدیو! خب، به موارد زیر برای انجام این پروژه نیازمندیم: 1. یک برد آردوئینو که از USB پشتیبانی کند و دارای پردازنده ATmega32u4 باشد! (مانند:Leonardo, Micro, یا Due board). 2. کابل USB 3. سیم 4. بردبورد 5. کلید فشاری در بعد نرم افزاری: 1. IDE Arduino از لحاظ برنامه نویسی با کار پیچیده ای روبرو نیستیم، می توانید یک کلید تعریف کنید که تنها حرف R را تایپ کند یا یک کلید ترکیبی از Ctrl + C بسازید که عملیات کپی را انجام دهد. حتی به سادگی می توانید عملیات را زمان بندی کنید تا با فشار کلید، یک سری عملیات ها (فشار کلید) انجام شود. در اینجا ما برای فهم بهتر پروژه دو مثال می زنیم، ابتدا بیایید یک کلید را به برد خود متصل کنیم! این تصویر هم توسط Fritzing ایجاد شده! که بعدا مفصل در موردش صحبت خواهیم کرد. همانطور که می بینید، ما 2D را به وسیله دکمه به GND متصل می کنیم تا عملیات فیزیکی فشار دکمه کیبورد را ایجاد کنیم. اکنون بورد خود را به وسیله USB به رایانه خود متصل کنید و IDE Arduino رو اجرا کنید. در گام اول، کتابخانه کیبورد را به پروژه با تایپ عبارت زیر اضافه می کنیم: #include "Keyboard.h" در void setup، پین 2 را به عنوان ورودی تعریف می کنیم و کیبورد را فراخوانی می کنیم، با این فراخوانی، برد شما به عنوان یک کیبورد شناسایی خواهد شد! void setup() { // make pin 2 an input and turn on the // pullup resistor so it goes high unless // connected to ground: pinMode(2, INPUT_PULLUP); // initialize control over the keyboard: Keyboard.begin(); } و حالا در حلقه، با توجه به اینکه در حال فشار دکمه هستیم یا خیر، کلید مورد نظر را فراخوانی می کنیم. برای تشخیص در حال فشرده شدن کلید می توان از یک شرط ساده استفاده کرد: void loop() { while (digitalRead(2) == HIGH) { // do nothing until pin 2 goes low delay(500); } خب اکنون می خواهیم کلید ; را بسازیم: Keyboard.press(';'); delay(100); Keyboard.releaseAll(); به همین سادگی ما یک کلید را ساختیم که با فشار آن و نگه داشتنتش، هر دهم ثانیه، یکبار ; را تایپ می کند. اما اگر بخواهید از کلید Ctrl استفاده کنید، باید آن را تعریف کنید، در کیبوردهایی که از ویندوز (و همچنین لینوکس) پشتیبانی می کنند، این کلید به صورت زیر تعریف می شود: char ctrlKey = KEY_LEFT_GUI; هر چند لازم نیست (آخه کاربرای مک کجا از این کارا می کنند؟! ) اما برای مک به صورت زیر است: char ctrlKey = KEY_LEFT_CTRL; دیگر چیزی تغییر نمی کند جز اینکه باید قبل از کلید c، کلید ctrl را فشار دهیم! // Copy: Keyboard.press(ctrlKey); Keyboard.press('c'); delay(100); Keyboard.releaseAll(); به همین سادگی! می توانید عملیات های پیچیده دیگری رو هم تعریف کنید! #لذت_ببرید اما کدها به صورت کامل: تک کلید: #include "Keyboard.h" void setup() { // make pin 2 an input and turn on the // pullup resistor so it goes high unless // connected to ground: pinMode(2, INPUT_PULLUP); // initialize control over the keyboard: Keyboard.begin(); } void loop() { while (digitalRead(2) == HIGH) { // do nothing until pin 2 goes low } delay(500); Keyboard.press('n'); delay(100); Keyboard.releaseAll(); } و برای کپی: #include "Keyboard.h" void setup() { // make pin 2 an input and turn on the // pullup resistor so it goes high unless // connected to ground: pinMode(2, INPUT_PULLUP); // initialize control over the keyboard: Keyboard.begin(); } void loop() { while (digitalRead(2) == HIGH) { // do nothing until pin 2 goes low } delay(1000); // Copy for Win/Linux: Keyboard.press(ctrlKey); Keyboard.press('n'); delay(100); Keyboard.releaseAll(); }
  5. با سلام. امروز با معرفی و آموزش Windows Template Studio که به تازگی از سمت مایکروسافت منتشر شده است، در خدمت شما هستیم. ویندوز تمپلیت استودیو در حقیقت یک محیط در ویژوال استودیو است که شما پروژه ی خود + امکانات و شمای کلی پروژه را تعریف میکنید، و تمپلیت استودیو قسمت زیادی از نرم افزار را برایتان کد می زند! ویندوز تمپلیت استودیو یک جانشین تمام عیار برای App Studio است که هم برای مبتدیان و هم برای حرفه ای ها کاربردی است. حالا بریم سراغ اصل مطلب: به چه چیزی نیاز داریم؟ 1-ویندوز 10 2-ویژوال استودیو 2017 (روی 2015 تست نشده، امکان دارد به مشکلاتی بخورد) 3-آخرین نسخه از SDK ویندوز 10 تمپلیت استودیو را دانلود و نصب کنید! 1-از این لینک آخرین نسخه ی ویندوز تمپلیت استودیو را دانلود کنید. 2-فایل دانلود شده را اجرا کنید تا فایل های مربوطه را دانلود و نصب کند. امکان دارد که برای نصب به VPN نیاز داشته باشید. حجم دانلودی هم زیر 1 گیگابایت می باشد. شروع به کار با تمپلیت استودیو 1-ویژوال استودیو را باز کنید. قسمت File/new/project را بزنید. 2- در صورت نصب کامل و صحیح تمپلیت استودیو باید در قسمت C#/Universal Windows ، گزینه ی Windows Template Studio(Universal Windows) را ببینید. روی آن کلیک کنید تا صفحه ی تمپلیت استودیو باز شود. 3- در اینجا شما نوع پروژه و فریمورک خود را مشخص میکنید. -نوع پروژه: الف)Navigation Pane شما یک پروژه به نوع نویگیشن پین خواهید داشت که نویگیشن بین صفحات مختلف با کمک همبرگر منو صورت می گیرد. ب)Blank تمپلیت استودیو به شما یک پیج خالی تحول خواهد داد. هر جور که خود صلاح میدانید نویگیشن آن را درست کنید ج)Pivot and tabs یک پیج حاوی چند تب به شما داده می شود که نویگیشن به کمک پیوت (Pivot) انجام خواهد شد. -فریموک استفاده شده(معماری نرم افزار): الف) Code Behind کد نویسی منطقی شما داخل کد بیهایند انجام خواهد شد. ب)MVVM Light کد نویسی با معماری MVVM انجام خواهد شد و از فریمورک سوم شخص MVVM Light استفاده خواهد شد. ج)MVVM Basic کد نویسی به صورت MVVM انجام می شود اما به صورت ساده. از هیچ گونه فریمورکی هم استفاده نخواهد شد. بعد از انتخاب فریمورک و نوع نویگیشن، Next را بزنید. 4- انتخاب ویژگی ها و امکانات برنامه الف) پیج ها در می توانید پیج های مختلفی را به نرم افزار خود اضافه کنید. انواع این پیج ها : ساده، همراه با چارت، همراه با گرید ویو، همراه با نقشه، پیج مستر دیتیل (همانند نرم افزار میل، تلگرام دسکتاپ، یونیگرام و ...)، همراه با مدیا پلیر، پیج تنظیمات، پیج تب دار (همراه با پیوت) و وب ویو هستند. ب) امکانات در اینجا می توانید امکانات مختلفی را به نرم افزار خود اضافه کنید. -مدیریت لایف سایکل نرم افزار شامل: مدیریت ذخیره ی ستینگز، مدیریت ساسپند و ادامه ی نرم افزار -بک گراند تسک -ارتباط به کاربر شامل : توست نوتیفیکیشن، پوش نوتیفیکیشن از طریق داشبورد، کاشی زنده و پوش نوتیفیکیشن آژور. امکانات نرم افزار خود را انتخاب کنید، Create را بزنید و صبر کنید تا تمپلیت استودیو نرم افزار را برایتان کد بزند مشاهده می شود که تمپلیت استودیو بسیار کد تمیز و قابل فهمی را جنریت میکند. که به راحتی قابل شخصی سازی و ادامه ی روند توسعه ی نرم افزار است. در ادامه نرم افزار را اجرا می کنیم به خوبی کار میکند ویندوز تمپلیت استودیو یک پروژه ی متن باز است که می توانید در گیت هاب پیدایش کنید.
  6. با سلام و عرض ادب و احترام خدمت شما. امروز با آموزش اولیه ی انتیتی فریمورک کور در خدمت شما هستیم. در این آموزشی شما : با مفاهیم پایه ای ORM و انتیتی فریمورک آشنا خواهید شد + با یک آموزش پروژه محور، راه اندازی انتیتی فریمورک کور و عملگر های اصلی آن را فرا خواهید گرفت. همانطور که می دانید، انتیتی فریمورک یک نوع ORM است. (از نظر خودم بهترین ORM) که اجازه ی ارتباط و مدیریت دیتابیس را در اختیارتان قرار می دهد. انتیتی فریمورک کور همان انتیتی فریمورک است که به صورت فراپلتفرمی اجرا شده است. این ORM میتواند در پروژه های دات نت فریمورک، زامارین، دات نت کور، ویندوز اپلیکیشن و ... روی هر پلتفرمی اجرا شود! ORM چیست؟ ORM (Object Relational Mapping) یک لایه مترجم بین زبان برنامه‌نویسی و پایگاه داده رابطه‌ای است که این دو را به هم تبدیل می‌کند و در عمل باعث می‌شود که این دو حیطه کاملا متفاوت زبان یکدیگر را به خوبی بشناسند و با هم تبادل اطلاعات داشته باشند. یک ORM قوی ، برنامه را از نوع پایگاه داده استفاده شده، جدا می‌کند. این کار باعث می‌شود که استقلال نسبت به نوع پایگاه داده حفظ شود. ORM ارتباط های دایمی و احتمالا پیچیده با پایگاه داده را انجام می دهد و نیازی به انجام اعمال تکراری وکد نویسی هایی تکراری توسط برنامه نویس در هر بار ذخیره فیلد و رکورد جدید و بازیابی اطلاعات و...نیست.از طریق ارتباطی که بوسیله ORM بین اشیاء و پایگاه داده ایجاد می شود می توان اطلاعات اشیاء را با صدا زدن یک متد در پایگاه داده ی خود ذخیره کنید. این ساده سازی که توسط ORM فراهم می شود باعث میشودبا کدهای کمتری کارهایی نظیر بازیابی اطلاعات را انجام دهیم وبعدها اگه خواستیم تغییراتی اعمال کنیم به راحتی بتونیم بازسازی وتغییرش بدیم. ORM محدود به هیچ زبان خاصی نیست و تنها یک تکنیک و سیستم است که می تواند در زبانهای مختلف پیاده سازی شود . چند نوع ارتباط اولیه با دیتابیس داریم؟ 1-Database First:در این روش ابتدا دیتابیس طراحی و پیاده سازی می شود و بعد از آن انتیتی فریمورک به وسیله ی ویزارد، کلاس ها و موارد دیگر ارتباط با دیتابیس را می سازد. 2-Model First: در این روش ابتدا به وسیله ی کلاس دیاگرام، مدل برنامه طراحی می شود و انتیتی فریمورک با آن دیتابیس و کلاس ها و موارد دیگر را می سازد. 3- Code First: در این روش ابتدا کلاس ها و منطق ابتدایی برنامه نوشته میشود، سپس با انتیتی فریمورک این کلاس ها و آبجکت ها به صورت فیلد ها و رکورد های دیتابیس در میاورد. در این روش برنامه نویس فقط وظیفه ی کد نویسی را دارد و این ORM است که دیتابیس را ساخته و آن را مدیریت میکند. در انتیتی فریمورک فقط اتصال اولیه ی دیتابیس راه های مختلف دارد اما از اینجا به بعد، همه چیز یکسان است. مفاهیم پایه ای: انتیتی(Entity): انتیتی یک کلاس ساده است که پس از فرایند مایگریت به جدول های دیتابیس تبدیل می شود. همچنین این کلاس ها در ارتباط کد فرست با دیتابیس مارا یاری خواهند کرد. DbSet: یک کالکشن در حافظه که مقادیر دیتابیس را در خود دارد. با کوئری های Linq میتوانیم به آن دسترسی داشته باشیم و اعمال add(inset),Delete,Update,Select را در آن انجام دهیم. مایگریتشن(Migration): فرایندی که ORM انتیتی ها را به کد های ساخت و یا تغییرات دیتابیس تبدیل می کند. مایگریت(Migrate): اجرای دستورات مایگریشن و اعمال تغییرات و یا ساخت دیتابیس. در ادامه به صورت پروژه محور با انتیتی فریمورک کور (به صورت Code First) آشنا خواهیم شد.
  7. با سلام و آرزوی قبولی طاعات و عبادات، امروز قصد معرفی و آموزش couchbase NoSQL را داریم. در ابتدا سوال که مطرح می شود این است که اصلا دیتابیس NoSQL چیست، کجا استفاده می شود و چرا باید استفاده شود. نو اس کیو ال، یک نوع پایگاه داده ی غیر رابطه ای می باشد که داده ها اغلب به صورت Document هایی حاوی Key:Value ذخیره می شوند. NoSQL ها معمولا بسیار سریع اند، قابلیت ذخیره ی ترابایت ها داده را دارند، به دلیل رابطه ای نبودن بسیار انعطاف پذیر اند و به دلیل اسکیما فورس نبودن بسیار توسعه پذیر (scalable) هستند. نو اس کیو ال نوع جدید و متفاوتی از پایگاه داده می باشد و برای یادگیری صحیح آن نیاز است که کمی از تفکرات بسیار منطقی و اسکیما فورس SQL و رابطه ای دور شویم و به ذخیره ی Json Document ها فکر کنیم. (به شخصه زیاد شده برای کار های خاص آبجکت جیسون سریالایز شده رو ذخیره کنم) نکته ی مهم این است که NoSQLجایگزین برای دیتابیس های رابطه ای نیست! بلکه راه حلی است برای مشکلات، چالش ها و موارد خاص در حوضه ی ذخیره ی دیتا. couchbase چیست؟ کوچ بیس یک دیتابیس NoSQL اوپن سورس با امکانات عالی می باشد. من جمله ی این امکانات می توان به: پشتیبانی از اکثر سیستم عامل ها، زبان های برنامه نویسی و فریمورک های مطرح و پر استفاده، وجود یک زبان شبه SQL برای امر کوئری، سرعت بالا، امکانات مدیریتی ساده و اما غنی، راه حل های بسیار خوب برای multi node cluster و بسیاری دیگر. اما نکته ی بسیار جالب درمورد couchbase (که دلیل این که من رو به خودش جذب کرد، همین بود) پشتیبانی از دستگاه های موبایل(!!!) و وجود سینک گیت وی بود. couchbase server دیتابیس کوچ بیس برای سرور است که برای سیستم عامل های ویندوز، لینوکس و مک ارائه شده. مدیریت این دیتابیس از سه روش 1-کنسول مدیریتی 2-REST API و 3-SDK هایی که برای زبان های برنامه نویسی مختلف ارائه شده (من جمله سی شارپ دات نت) قابل انجام است. couchbase lite یک کتابخانه ی کوچ بیس برای دستگاه های موبایل است! که با آن میتوان داده ها را داخل دیتابیس NoSQL داخل موبایل ذخیره کرد (جایگزین برای SQLite). این کتابخانه از اندروید، آی او اس، ویندوز(وین 32) و زامارین پشتیبانی میکند. (خبر خوب) از نسخه ی 2.0 (که درحال توسعه است) پشتیبانی از ویندوز یونیورسال هم اضافه شده است. نسخه ی 2.0 نسبت به نسخه ی عرضه شده ی فعلی بهبود ها و تغییرات بسیار زیاد و بنیادینی را به خود دیده است. همچنین میتوان داده های آن را با کوچ بیس سرور و سینک گیت وی به وسیله ی ابزار داخل کتابخانه و یا REST API سینک کرد. couchbase sync-gateway یک ابزار تحت وب است که با آن میتوان داده های داخل دیتابیس را با دستگاه های دیگر سینک کرد.الگوریتم سینک بسیار پیاده سازی سختی دارد، اما سینک گیت وی تمام این کار های سخت را برایتان انجام خواهد داد. سینک گیت امکان وی مدیریت یوزر، مدیریت کانفلیکت، مدیریت سینک، آفلاین فرست\آنلاین فرست (ریل تایم) سینک، سینک از طریق REST API ، سینک تحت شبکه (P2P sync) و بسیاری دیگر را به شما خواهد داد. کوچ بیس لایت در عمل: در این_لینک میتوانید داکیومنت های بیشتری را در مورد پیاده سازی کوچ بیس پیدا کنید. گرچه در روز های آتی، درصورت درخواست، آموزشی های اختصاصی تهیه خواهد شد. موید باشید
  8. سلام؛ اگر شما هم با پنل GridView کار کرده باشید، حتما در نمایش آیتم ها در صفحات مختلف دچار مشکل فضای خالی در طرفین آیتم ها شدید. متاسفانه این کنترل به خوبی بهینه نشده و کاملا رسپانسیو عمل نمی کند. بنابراین باید از راه حلی دیگر این مشکل رو جبران کنیم تا آیتم ها تمام عرض پنل رو بپوشانند و فضای خالی آزار دهنده ای جلوی چشم مخاطب قرار نگیرد. اما حالا بریم سراغ توضیحات: ابتدا در xml کنترل گرید ویو، کدهای زیر رو اضافه می کنیم، تا عرض هر آیتم به اندازه فضای آزاد برسه: GridView.ItemContainerStyle> <Style TargetType="GridViewItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> <Setter Property="VerticalContentAlignment" Value="Stretch" /> </Style> </GridView.ItemContainerStyle> به این منظور باید در رویداد SizeChanged گرید ویو میزان عرض هر آیتم رو بصورت دستی تغییر بدیم. من برای این کار تعداد ستون هایی رو که می خوام در عرض صفحه میشه نمایش داد رو محاسبه می کنم و سپس این عرض "حداکثری" رو به آیتم ها می دم. من عرض حداکثری هر آیتم رو 850 انتخاب کردم: private void gvFave_SizeChanged(object sender, SizeChangedEventArgs e) { var columns = Math.Ceiling(ActualWidth / 850); ((ItemsWrapGrid)gvFave.ItemsPanelRoot).ItemWidth = e.NewSize.Width / columns; } به همین سادگی می تونید از شر فضای خالی راحت بشید. اگر سوالی بود در خدمتم. با تشکر
  9. چارچوب XAML راه های بسیاری را به ما می دهند تا بتوانیم ظاهر برنامه هایمان را سفارشی سازی کنیم. استایل دادن به کنترل ها Style ها به شما اجازه می دهند که خواص کنترل ها را تنظیم کرده و از آن تنظیمات برای ظاهر چندین کنترل استفاده نماییم قالب های کنترل می توانید ساختار بصری و رفتار بصیری یک کنترل را با ساخت قالب برای کنترل هایتان در چارچوب XAML سفارشی سازی کنید. ResourceDictionary و منابع XAML توضیح می دهد که چگونه یک عنصر ResourceDictionary و منابع کلیدی تعریف می شود، و چگونه منابع XAML به باقی منابعی که شما تعریف کردید بخشی از برنامه یا پکیج برنامه شما باشد. منابع پوسته در XAML منابع پوسته ها در XAML مجموعه ای از تنظیمات منابعی است که مقادیر مختلفی را بسته به پوسته ای که در سیستم عامل فعال است، تعیین می کند. سه پوسته در چارچوب XAML پشتیبانی می شوند "تاریک" ، "روشن" ، "کنتراست بالا" | Dark, Light, HighContrast استایل کنترل ها شما می توانید ظاهر نرم افزار های خود را به روش های گوناگونی سفارشی سازی کنید. Style ها به شما اجازه می دهند که خواص کنترل ها را تنظیم کرده و از آن تنظیمات برای ظاهر چندین کنترل استفاده نماییم. شما یک قالب کنترل(Control Template) را زمانی ایجاد می کنید که می خواهید ساختار بصری و رفتار بصری کنترل را سفارشی سازی کنید. اصول پایه استایل دهی از استایل ها برای استخراج تنظیمات خواص بصری که می توانند دوباره استفاده مجدد شوند، استفاده می کنیم. در اینجا نمونه ای می زنیم که نشان می دهد سه دکمه با یک استایل که خواص BorderBrush، BorderThickness و Foreground برای آن تعیین شده است، استفاده می کنند. با اعمال یک استایل، شما می توانید کنترل هایی شبیه به هم ایجاد کنید بدون آنگه دوباره آن تنظیمات را برای هر کنترل به طور جداگانه تعیین کنید. شما می توانید یک استایل را به صورد درونی برای یک کنترل یا یک منبع قابل استفاده تعیین کنید. منابع می تواند در صفحه های XAML مورد نظرمان، درون صفحه App.xaml یا در صفحهات جداگانه که فایل XAMLـه ResourceDictionary نامیده می شوند تعریف کنید. یک فایل منبع دیکشنری XAML می تواند در سراسر برنامه به اشتراک گذاشته شود، بیش از یک منبع دیکشنری می تواند در یک برنامه ادغام شود. هر جایی که منبع تعریف شده است تعیین می کند که حوزه استفاده از آن چه محدوده ای داشته باشد. منابع سطع صحفه(درون یک صفحه XAML) فقط در همان صفحه ای که تعریف شده اند قابل استفاده است. اگر منابع با کلیدی که در App.xaml باشد درون صفحه همنام باشد، منبعی که درون صفحه، منبع درون App.xaml را بازنویسی می کند. اگر یک منبع در فایل های دیکشنری جداگانه ای تعریف شود، حوزه استفاده آن توسط جایی که این منبع به آن اشاره می کند، تعیین می شود. در تعریف استایل، شما نیاز به یک ویژگی به نام TargetType(نوع هدف)، و یک کالکشن از یک یا چندین عنصر Setter. ویژگی TargetType یک رشته است که FrameworkElementـی را برای اعمال در استایل مشخص می کند. مقدار TargetType باید از نوع یک FrameworkElement مشتق شده باشد که توسط Windows Runtime یا یک نوع سفارشی که درون برنامه تعریف شده و در دسترس است، باشد. اگر شما سعی کنید که یک استایل را برای یک کنترل اعمال کنید و نوع کنترل مورد نظر با ویژگی TargetType مطابقت نداشته باشد، یک استثنا(Exception) دریافت خواهید کرد. هر عنصر Setter دارای یک Property(خاصیت) و یک Value(مقدار) است. تنظیمات این خواص نشان می دهد که تنظیمات خواص کنترل و مقادیر آن خواص برای چه چیزی اعمال شده است. شما می تواند Setter.Value را با هر عنصر یا خاصیت عنصری تنظیم کنید. کد XAMLـی که اینجاست، استایل هایی که به دکمه ها در عکس پیشین اعمال شده بود را نشان می دهد. در این XAML، در ابتدا دو عنصر Setter در بدنه به عنوان ویژگی استفاده شده است، اما آخرین Setter، برای تعیین خاصیت BorderBrush در بدنه به عنوان عنصر استفاده شده است. در این نمونه از ویژگی x:Key که کلید استایل را تعیین می کند استفاده نشده است، پس استایل به صور ضمنی برای دکمه ها اعمال می شود. اعمال استایل های ضمنی درون بخش بعدی توضیح خواهد شد. <Page.Resources> <Style TargetType="Button"> <Setter Property="BorderThickness" Value="5" /> <Setter Property="Foreground" Value="Blue" /> <Setter Property="BorderBrush"> <Setter.Value> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <GradientStop Color="Yellow" Offset="0.0" /> <GradientStop Color="Red" Offset="0.25" /> <GradientStop Color="Blue" Offset="0.75" /> <GradientStop Color="LimeGreen" Offset="1.0" /> </LinearGradientBrush> </Setter.Value> </Setter> </Style> </Page.Resources> <StackPanel Orientation="Horizontal"> <Button Content="Button" /> <Button Content="Button" /> <Button Content="Button" /> </StackPanel> اعمال یک استایل ضمنی یا صریح اگر شما درون یک منبع استایلی را تعریف کنید، دو نوم راه برای اعمال آن برای کنترل خود دارید: · به صورت ضمنی، با تعیین فقط یک TargetType برای استایل. (یعنی کلیدی تعریف نکنید) · به صورت صریح، با مشخص کردن یک TargetType و یک ویژگی کلید x:Key برای استایل و سپس با تنظیم این استایل با استفاده از کد {StaticResource} و نام کلید جلوی آن. اگر استایلی دارای ویژگی x:Key باشد، شما می توانید فقط برای کنترل هایی که می خواهید این استایل را داشته باشند با تعیین کلید این استایل آنرا تنظیم و اعمال کنید. تضاد این موضوع، آن است که استایل را بدون ویژگی x:Key تعریف کیند تا به طور خودکار برای همه ی کنترل هایی که درون TargetTypeـه استایل تعیین شود که به صورت صریح تنظیمات استایل تعریف نشده است، اعمال شود. این دو دکمه نمونه ای از استایل ضمنی و صریح را نشان می دهند: در این مثال، اولین استایل دارای یک ویژگی x:Key است و TargetType آن برابر با Button است. اولین خاصیت استایل دکمه، به این کلید تنظیم شده است، پس این استایل از نوع صریح را اعمال کرده است. دومین استایل به صورت ضمنی برای دکمه دوم اعمال شده است چرا که TargetTypeـه آن برابر با Button است و استایل آن نیز بدون ویژگی x:Key است. <Page.Resources> <Style x:Key="PurpleStyle" TargetType="Button"> <Setter Property="FontFamily" Value="Lucida Sans Unicode" /> <Setter Property="FontStyle" Value="Italic" /> <Setter Property="FontSize" Value="14" /> <Setter Property="Foreground" Value="MediumOrchid" /> </Style> <Style TargetType="Button"> <Setter Property="FontFamily" Value="Lucida Sans Unicode" /> <Setter Property="FontStyle" Value="Italic" /> <Setter Property="FontSize" Value="14" /> <Setter Property="RenderTransform"> <Setter.Value> <RotateTransform Angle="25" /> </Setter.Value> </Setter> <Setter Property="BorderBrush" Value="Orange" /> <Setter Property="BorderThickness" Value="2" /> <Setter Property="Foreground" Value="Orange" /> </Style> </Page.Resources> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> <Button Content="Button" Style="{StaticResource PurpleStyle}" /> <Button Content="Button" /> </StackPanel> استفاده از استایل Based-on(بر پایه...) برای آسانتر ساختن استایل ها و حف و بهینه سازی برای استفاده مجدد از آن ها، شما می توانید استایل ها طوری بسازید که یک استایل از استایل دیگری ارث بری کند. شما از خاصیت BasedOn برای ساخت استایل ارث بری استفاده خواهید کرد. استایل هایی که از استیل های دیگر ارث بری می کنند باید TargetTypeـه آن مثل کنترلی که می خواهیم، یا کنترلی که از آن مشتق شده است باشد. برای مثال، اگر پایه یک استایل بر اساس ContentControl باشد، استایل هایی که از این استایل ارث بری می کنند می توانند Target(مقصد)ـی از ContentControl یا انواعی از کنترل ها باشد از ContentControl مشتق شده اند مانند Button و ScrollViewer. اگر یک مقدار بر پایه استایلی تنظیم نشود، ار استایل پایه ارث بری خواهد کرد. برای تغییر یک مقدار از استایل پایه، استایل based-on آن مقدار را بازنویسی خواهد کرد. در مثال بعدی یک دکمه و یک CheckBox را که از استایل پایه ارث بری می کنند نشان می دهد. Targetـه استایل پایه ContentControl می باشد، و خاصیت های Height(ارتفاع)، و Width(عرض) را تنظیم می کند. استایل هایی که بر پایه این استایل هستند CheckBox و Button را مورد هدف قرار می دهند که از ContentControl مشتق شده اند. استایل های based-on رنگ های متفاوتی را برای خاصیت های BorderBrush و Foreground تنظیم می کنند.(شما به طور معمول یک بردر را اطراف یک CheckBox قرار نمی دهید. در اینجا ما این کار را انجام دادیم تا به شما تاثیرات استایل دهی را نشان دهیم.) <Page.Resources> <Style x:Key="BasicStyle" TargetType="ContentControl"> <Setter Property="Width" Value="130" /> <Setter Property="Height" Value="30" /> </Style> <Style x:Key="ButtonStyle" TargetType="Button" BasedOn="{StaticResource BasicStyle}"> <Setter Property="BorderBrush" Value="Orange" /> <Setter Property="BorderThickness" Value="2" /> <Setter Property="Foreground" Value="Red" /> </Style> <Style x:Key="CheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource BasicStyle}"> <Setter Property="BorderBrush" Value="Blue" /> <Setter Property="BorderThickness" Value="2" /> <Setter Property="Foreground" Value="Green" /> </Style> </Page.Resources> <StackPanel> <Button Content="Button" Style="{StaticResource ButtonStyle}" Margin="0,10" /> <CheckBox Content="CheckBox" Style="{StaticResource CheckBoxStyle}" /> </StackPanel> کتاب الکترونیک این درس پیوست شد. این درس به اتمام رسید، امیدوارم همچنان همراه ما باشید... . منبع: وین نویس Windows 10 Introduction S01E06.pdf
  10. آموزش استفاده از کنترل های رایج XAML استفاده ترکیبی از کنترل ها باعث می شود که شما بهتر با نحوه کارکرد کنترل ها آشنا شوید. پروژه جدید یکپارچه ایجادکنید و نام آنرا WN XAML Common Controls قرار دهید. در این پروژه قرار است با نحوه استفاده از کنترل های زیر آشنا شویم: ListView CheckBox RadioButton StackPanel ComboBox TextBox Image GridView Rectangle DatePicker TimePicker Pivot (تصویر بالا شکل برنامه است) صفحه MainPage.xaml را باز کنید و کدهای زیر را به جای <Grid.. </Grid> قرار دهید: <ListView x:Name="listView1" Background="White"> <CheckBox x:Name="checkBox1" Margin="5" Content="Check Box 1" /> <CheckBox x:Name="checkBox2" Margin="5" Content="Check Box 2" /> <StackPanel Orientation="Horizontal"> <RadioButton x:Name="radioButton1" Margin="5" Content="Radio Button 1" /> <RadioButton x:Name="radioButton2" Margin="5" Content="Radio Button 2" /> </StackPanel> <ComboBox x:Name="comboBox1" Margin="5"> <ComboBoxItem Content="ComboBox Item 1" /> <ComboBoxItem Content="ComboBox Item 2" /> <ComboBoxItem Content="ComboBox Item 3" /> <ComboBoxItem Content="ComboBox Item 4" /> <ComboBoxItem Content="ComboBox Item 5" /> </ComboBox> <TextBox x:Name="textBox1" Margin="5" Text="http://www.win-nevis.com" /> <Image x:Name="image1" Margin="5" Source="WinNevisLogo.png" Stretch="None" /> <GridView x:Name="gridView1" Margin="5"> <Rectangle x:Name="rectangle1" Fill="Red" Height="100" Width="100" /> <Rectangle x:Name="rectangle2" Fill="#FF00C5FF" Height="100" Width="100" /> <Rectangle x:Name="rectangle3" Fill="#FFFFD100" Height="100" Width="100" /> </GridView> <DatePicker x:Name="datePicker1" Margin="5" /> <TimePicker x:Name="timePicker1" Margin="5" /> </ListView> بپردازیم به کدها... <ListView x:Name="listView1" Background="White">… ListView در ابتدا کنترل ListView قرار دادیم تا همه ی کنترل ها به صورت لیستی عمودی در زیر هم قرار بگیرند. کنترل ListView بسیار پر کاربرد است، این کنترل دارای Property های خاصی است که چند نمونه را بیان می کنیم... . Items کالکشنی (لیست) است که کنترل ها را در خود جای می دهد، این پراپرتی از نوع ItemCollection است و می تواند تقریبا هر کنترل یا شئ ای را در خود جای دهد. این پراپرتی دارای توابعی است که از آنها می توان به Add, Remove, RemoveAt, Insert, Clear اشاره نمود. تابع Add برای اضافه کردن کنترل، Remove برای حذف کنترل چنانچه آن کنترل را در اختیار داشته باشیم، RemoveAt برای حذف کنترل بر اساس شناسه، Insert اضافه کردن آیتم در یک شاخص خاص(مثلا در ردیف 50)، Clear برای پاک کردن تمامی کنترل ها از لیست به کار می روند. SelectedIndex یا شاخص انتخاب شده، داده ی عددی از نوع integer است. این داده عددی را برمیگرداند که از آیتم انتخاب شده لیست ویو است. توجه داشته باشید که اندیس کنترل ها را بازگردانی می کند. SelectedItem آیتم انتخاب شده را بازگردانی می کند که با نوع object است یعنی پس از آن دریافت باید نوع آنرا خودمان تعیین کنیم. یعنی اگر در لیست بنده همه آیتم ها از نوع TextBox هستند، این کار را باید انجام دهیم: TextBlock selectedItem = listView1.SelectedItem as TextBlock; چنانچه مانند نمونه کدها، از چندین نوع شئ در لیست ویو استفاده می کنیم، نوع آیتم انتخاب شده را دریافت کنید و در شرطی آنرا بررسی کنید:[/size] if(listView1.SelectedItem.GetType() == typeof(TextBlock)) { // code } تابع GetType نوع هر داده ای را باز گردانی می کند که از نوع Type می باشد. کلمه کلیدی typeof نیز مشخص می کند که ما می خواهیم تایپ یا نوع داده را از نوعی که می خواهیم باشد. پس چنانچه آیتم انتخاب شده برابر با نوعی است که ما می خواهیم شرط درست است. SelectedItems در لیست ویو امکان انتخاب چند مورد وجود دارد، این پراپرتی توانایی بازگردانی لیست آیتم های انتخاب شده را داراست. SelectedMode تعیین می کند که آیا لیست ویو بتواند یک آیتم، چند آیتم را انتخاب کند یا اینکه حتی نتواند آیتمی را انتخاب کند. <CheckBox x:Name="checkBox1" Margin="5" Content="Check Box 1" /> <CheckBox x:Name="checkBox2" Margin="5" Content="Check Box 2" /> CheckBox جعبه انتخابی، اجازه می دهد کاربر گزینه ای را تیک بزند، اگر از چندین CheckBox در یک کنترل والد استفاده کنیم، هر چک باکس می تواند تیک (علامت) بخورد یا نخورد و وابسته با باقی چک باکس ها ندارد. پراپرتی IsSelected می تواند سه مقدار بگیرد، True و False و x:Null که تعیین می کند چک باکس ما کدام وضعیت را دارد. <StackPanel Orientation="Horizontal"> StackPanel این کنترل نیز مانند ListView است با اندکی تفاوت. پراپرتی Orientation تعیین می کند که کنترل هایی که درون این شئ قرار می گیرند به چه صورت اضافه شوند(عمودی یا افقی) به صورت پیشفرض اگر این پراپرتی را تعیین نکنیم کنترل هایی که اضافه می شوند به صورت عمودی زیر هم قرار می گیرند. در اینجا حالت افقی را قرار داده ایم تا دو کنترل RadioButton در کنار هم قرار بگیرند. <RadioButton x:Name="radioButton1" Margin="5" Content="Radio Button 1" /> <RadioButton x:Name="radioButton2" Margin="5" Content="Radio Button 2" /> RadioButton دکمه رادیویی نیز مانند CheckBox است اما با کمی تفاوت، چناچه یکی از آنها انتخاب شود، آیتم های دیگر خودکار تیک آنها برداشته می شود، برای مثال نمی توانیم هر دو مورد را علامت بزنیم، چنانچه اقدام به این کار کنیم، شئ دیگر خودکار علامتش برداشته میشود. البته این موضوع به والد آنها نیز وابسطه است. در اینجا شئ والد StackPanel است اگر در یک StackPanel دیگر دو دکمه رادیویی دیگر قرار دهیم، علامت زدن آنها به علامت زدن این دو ربطی نخواهد داشت. <ComboBox x:Name="comboBox1" Margin="5"> <ComboBoxItem Content="ComboBox Item 1" /> <ComboBoxItem Content="ComboBox Item 2" /> <ComboBoxItem Content="ComboBox Item 3" /> <ComboBoxItem Content="ComboBox Item 4" /> <ComboBoxItem Content="ComboBox Item 5" /> </ComboBox> ComboBox جعبه ترکیبی برای به نمایش در آوردن آیتم های فراوان است که یکی از آنها قابل انتخاب است. این کنترل می تواند هر نوع داده ای را در خود جای دهد. مانند لیست ویو SelectedIndex و SelectedItem دارد. <TextBox x:Name="textBox1" Margin="5" Text="http://www.win-nevis.com" /> TextBox جعبه متنی، این کنترل به کاربر این امکان را می دهد که بتواند چیزی را بنویسید.پراپرتی Text متن نوشته کاربر است. پراپرتی InputeScope به صورت پیشفرض اعداد، حروف، سمبل ها و... در تکست باکس قابل نمایش است، اما چنانچه می خواهید تکست باکس را اختصاص دهید مثلا برای فقط شماره ها، یا ایمیل، یا چت، بهتر از این پراپرتی استفاده کنید که دارای 42 گزینه برای انتخاب است! پراپرتی PlaceholderText نیز متنی را به نمایش در می آورد زمانی که هیچ چیزی در TextBox نوشته نشده باشد. مثلا همان type something در اکثر برنامه های چت. <Image x:Name="image1" Margin="5" Source="WinNevisLogo.png" Stretch="None" /> Image این کنترل تصاویر را به نمایش می گذارد. با استفاده از پراپرتی Source می توانیم محل عکس را تعیین کنیم، در اینجا عکسی با نام WinNevisLogo.png در قسمت روت پروژه وجود دارد که آنرا اینگونه تعریف کردیم. پراپرتی Stretch یا کِش آمدن تصویر، این امکان را می دهد که تصاویر را کِش آوریم یا اینکه تصویر اصلی با سایت اصلی را به نمایش در آوریم. <GridView x:Name="gridView1" Margin="5"> GridView این کنترل نیز مانند لیست ویو است با این تفاوت که کنترل ها در کنار هم به صورت افقی قرار می گیرند. چنانچه تعداد کنترل ها بیش از اندازه عرض صفحه باشد، کنترل ها به صورت افقی و عمودی در می آیند. <Rectangle x:Name="rectangle1" Fill="Red" Height="100" Width="100" /> <Rectangle x:Name="rectangle2" Fill="#FF00C5FF" Height="100" Width="100" /> <Rectangle x:Name="rectangle3" Fill="#FFFFD100" Height="100" Width="100" /> Rectangle کنترل رنگی با استفاده از پراپرتی Fill می توان رنگ یا تصویری را برای آن انتخاب نمود. <DatePicker x:Name="datePicker1" Margin="5"/> DatePicker انتخاب گر تاریخ، دارای پراپرتی Date از نوع DateTimeOffset است که کاربر می تواند تاریخی را انتخاب کند. <TimePicker x:Name="timePicker1" Margin="5" /> TimePicker انتخاب گر زمان، دارای پراپرتی Time از نوع TimeSpan است که کاربر می تواند زمانی را انتخاب کند. خب تا اینجا با 11 کنترل از 13 تایی که قرار بود آموزش بدهیم، آشنا شدید. برای دو کنترل دیگر دو پروژه مجزا ایجاد می کنیم. Pivot پروژه جدیدی یکپارچه ای به نام WN Pivot Sample ایجاد و صفحه MainPage.xaml را در آن باز کنید. در پنجره Toolbox دو بار روی کنترل Pivot کلیک کنید یا اینکه آنرا بکشید و در صفحه طراحی رها کنید تا این کنترل به صفحه اضافه شود: کنترل Pivot دارای خاصیتی به نام Title است که عنوان را مشخص می کند، معمولا نام برنامه را در این قسمت قرار می دهند. نیازی نیست حتما Pivot دارای عنوان باشد. عناصری که Pivot به عنوان تب قرار میگیرند PivotItem نام دارند. Pivot فقط می تواند PivotItem را به نمایش در آورد ما نمی توانیم جای PivotItem از Grid یا کنترل های دیگر استفاده کنیم. هر PivotItem دارای خاصیتی به نام Header است که نام یا آیکون تب را تعیین می کند. اگر بخواهیم جای نوشته از آیکون یا عکسی استفاده کنیم کافی است Header را پاک کرده و درون تَگِ PivotItem تگِ زیر را اضافه کنیم: <PivotItem.Header> <Image Source="WinNevisLogo.png" /> </PivotItem.Header> با این کار می توانیم عکسی را جای نوشته قرار دهیم: هر PivotItem می تواند یک Content ـی داشته باشد که به صورت پیشفرض Grid است چرا که میتواند تمامی اشیاء را درون خود جای دهد. روی <Grid/> PivotItem اول کلیک کنید و از ToolBox کنترل TextBlockـی را به درون قسمت طراحی اضافه کرده و نام آنرا برابر با Win-Nevis بگذارید. حال روی Gridـه PivotItemـه دوم کلیک کرده و کنترل دکمه ای درون آن بیاندازید و Content آنرا برابر با Click قرار دهید. چیزه خاص دیگری نیست که فعلا نیاز باشد راجع به این کنترل بدانید، پس به همین اکتفا می کنیم. نکته: قرار بود SplitView و ساخت منوی همبرگری رو هم توی این درس آموزش بدیم اما چون لازمه ی این کار چیزهای دیگری است ساخت منوی همبرگری به درس های بعد موکول می شود. کتاب الکترونیک + پروژه این درس پیوست شد. این درس به اتمام رسید، امیدوارم همچنان همراه ما باشید... . منبع: وین نویس Windows 10 Introduction S01E04.pdf WN Xaml Common Controls.zip
  11. با سلام. من توی دیتابیسم، یک موجودیت دارم که مثلا یه آی دی داره و یه اسم و یه کتگوری. توی اون کتگوری هم کاربر میتونه چندین هشتگ بزنه. و ما میخویم سرچ هشتگی بزاریم. کاربر هشتگ رو سرچ کرد، موارد رو با اون هشتگ نشان بده. چطور باید این کارو کنیم ؟
  12. سلام؛ اینترنت اشیاء یک بخش بسیار هیجان انگیز از دنیای دیجیتالی ماست که برنامه نویس ها بیشتر از هر کسی می تونند از اون بهره برداری کنند. تا قبل از اینکه بردهای آماده ای مانند رسپبری پای یا آردوئینو به بازار بیان، مهندسین الکترونیک می توانستند سهم بیشتری از این بازار رو کسب کنند اما حالا شما بردهایی آماده دارید که منتظر دمیده شدن روح (برنامه) در کالبدشان هستند تا آنچه می خواهید را برای شما به اجرا در آورند. غیر از بردهای نامبرده شده، بردهای دیگری از شرکت های مختلق مثل اینتل و حتی مایکروسافت هم وجود دارد که به دو دلیل گران قیمت بودن و همچنین در دسترس نبودنشون در ایران، بردهای رسپبری پای خواهان بیشتری چه در ایران و چه در خارج از کشور دارند. توجه کنید که بردهای بر پایه آردوئینو قابلیت اجرای ویندوز اینترنت اشیاء رو ندارند ولی برای بسیاری از کارها در کنار رسپبری پای بهشون نیاز دارید. هم اکنون قیمت یک بورد رسپبری پای 3 حدود 165 تومان هست که با توجه به امکاناتی که به شما می دهد واقعا ارزان محسوب می شود. نسخه سوم علاوه بر بهبودهای پردازشی و گرافیکی، از بلوتوث داخلی و Wi-Fi داخلی نیز بهره می برد که اون رو به یک انتخاب فوق العاده تبدیل می کند. بیش از این مقدمه رو کش نمی دهم، امیدوارم شما هم به جمع ما بپیوندید و چیزهای شگفت انگیزی خلق کنید. بریم سراغ اصل مطلب: آموزش نصب ویندوز 10 iot روی رسپبری پای 3 توی نت که گشتم متاسفانه مطلب مناسبی پیدا نکردم و فقط وبسایتی رو دیدم که این آموزش به همراه محتواش رو به قیمت 30 هزار تومان به فروش می رساند. شاید به خاطر برخی نکات ریزی است که برای جستجو آن باید ساعتی را در نت به مطالعه بپردازید. به هر صورت ما طبق فلسفه انجمن، این آموزش رو رایگان تقدیم به علاقه مندان می کنیم و هر نکته ای را که در این مسیر با آن برخورد کردم رو حتما بیان می کنم. در مرحله اول توجه کنید که برای نصب windows 10 iot به یک میکرو اس دی کارت پر سرعت نیاز دارید. حداقل اس دی کارت شما باید کلاس 10 U1 را داشته باشد تا بتواند به راحتی ویندوز را اجرا کند، در غیر این صورت منتظر اجرای ویندوز نباشید. موضوع بعد که ممکن است کمتر کسی به اون توجه داشته باشد، منبع تغذیه است. من از یک منبع تغذیه 5 ولتی با خروجی 2 تا 2.1 آمپری استفاده کردم. این منبع تغذیه ویندوز را بوت می کند اما خبری از تامین نیاز کیبورد و ماوس نیست! برای اینکه بتوانید از ماوس و کیبورد استفاده کنید به یک منبع تغذیه 2.5 آمپری نیاز دارید. نکته اینکه در سایر سیستم عامل ها شما این همه دردسر ندارید، با این حال اگر سیستمی می خواهید که برنامه یونیورسال شما را به خوبی اجرا کند، پس به این لوازم نیاز داریدو مطمئن باشید شیمان نخواهید شد (حداقل من نشدم!). با چیزهایی که می دانید می توانید دستگاه های فوق العاده ای را بسازید. خب؛ حالا که لوازم رو تهیه کردید به سراغ نصب ویندوز می رویم. در قدم اول باید Windows 10 IoT Core را از سایت مایکروسافت دانلود و نصب کنید. در تمام طول نصب ویندوز 10 اینترنت اشیاء به اینترنت نیاز هست. Download Windows 10 IoT Core بعد از دانلود آن را نصب و سپس اجرا کنید؛ از قسمت سمت چپ گزینه Setup new Device را انتخاب کنید. مطابق تصویر اطلاعات را انتخاب کنید، در قسمت Wi-Fi networc Connection باید شبکه وایفایی را که می خواهید رسپبری شما به آن متصل شود را انتخاب کنید. مسلما نیاز هست که دستگاهی که بر روی آن داشبورد را نصب کرده اید به آن شبکه متصل باشد تا بتوانید پروفایل آن را داشته باشید. نکته: اگر به یک شبکه وایفای متصل هستید و با این حال در این قسمت چیزی نمی بینید بهتر است یک بار سیستم خودتان را ریسیت کنید و برنامه را مجددا اجرا کنید. حالا SD Card خودتون رو به سیستمتون متصل کنید و سپس تیک گزینه i Accept ... رو بزنید و در نهایت کلید دانلود را بزنید و منتظر بمانید دانلود و نصب به اتمام برسد. بعد از اتمام، اس دی کارت را به رسپبری متصل کنید، یک صفحه کلید و یک خروجی تصویر را هم به رسپبری متصل کنید. توجه کنید که اگر کیبوردی به دستگاه متصل نکنید رسپبری تصویری را بر روی نمایشگر نمایش نخواهد داد (!!). پس از اتصال همه موارد، در آخر منبع تغذیه را وصل کنید و منتظر بمانید تا ویندوز بوت شود. اگر تصویر بوت ویندوز 10 را ندیدید، پس باید در فایل کانفیگ ویندوز 10 اشیا تغییراتی را ایجاد کنید. اس دی کارت را از طریق سیستمتان باز کنید و در صفحه اصلی به دنبال فایل Config.txt باشید. آن را باز کرده و عدد مقابل با hdmi_group را به 1 برگردانید. ذخیره کنید و مجددا اس دی کارت را به رسپبری برگردانید و آن را روشن کنید. init_uart_clock=16000000 kernel_old=1 safe_mode_gpio=8 max_usb_current=1 gpu_mem=32 hdmi_force_hotplug=1 core_freq=250 framebuffer_ignore_alpha=1 framebuffer_swap=1 disable_overscan=1 hdmi_group=2 display_rotate=0 hdmi_mode=4 پایان.
  13. توضیح مختصر : زبان برنامه نویسی BrainFuck یک زبان برنامه نویسی مناسب برای کارهای تجاری و عملی نیست در واقع هدف اصلی طراح این زبان آن بوده که با سینتکس این زبان برنامه نویسان را به چالش بکشد اما ممکن است از خودتون بپرسید چرا باید از یک همچین زبانی استفاده کنیم.خوب برای من جواب این سوال مشخص است چون پیشرفت در دنیای کامپیوتر و مخصوصاً مقوله برنامه نویسی با به چالش کشیده شدن میسر است در واقع استفاده از این زبان باعث می شود نحوه نگاه کردن شما به برنامه نویسی عوض شود و دید بازتری پیدا کنید و یک گام در طراحی الگریتمهای پیچیده جلوتر از بقیه دوستان باشید. همچنین به دلیل ساده بودن این زیان برنامه نویسی، یادگیری آن بسیار ساده است. حتی کسانی هم که آشنایی با برنامه نویسی ندارند در 1 روز می توانند این زبان را یاد بگیرند ! و در کنار این مسئله تفریح نیز مطرح است کل کل کردن بین برنامه نویسان یکی از زیباترین تفریحهایی است که من در چندین سال گذشته که تو این رشته فعالیت داشته ام بوده است. این زبان در سال 1993 توسط Urban Müller توسعه یافته است. و اما اصل مطلب : این زبان برنامه نویسی به طور کلی از یک حافظه و یک اشاره گر و کلاً 8 عدد دستور تشکیل شده است.اشاره گر نشان دهنده خانه فعلی حافظه است که شما مشغول انجام عملیات برروی آن هستید و در شروع برنامه بر روی خانه صفر حافظه قرار گرفته است. با استفاده از عملگر > شما می توانید اشاره گر را به خانه بعدی حافظه منتقل نمایید و عملگر < نیز عکس این کار را برای شما انجام می دهد و اشاره گر را به خانه قبلی حافظه منتقل می کند. در کل دو عملگر اصلی ریاضی در این برنامه وجود دارد یکی عملگر + که یک واحد به خانه ای از حافظه که اشاره گر در حال حاظر به آن اشاره دارد اضافه می کند و عملگر – یک واحد از آن کم می کند. و برای چاپ خانه حافظه در خروجی نیز از عملگر نقطه "." استفاده می شود. ​کد اسکی چیست ؟ هر کاراکتر در کی برد دارای یک معادل عددی است. برای گرفتن این معادلات می توانید به جدول_اسکی مراجعه کنید. همچنین یک ابزار نیز در Brain_Studio برای گرفتن کد اسکی وجود دارد. خوب این اولین مثال برنامه است : فرض کنید می خواهید حرف “A” را در خروجی چاپ نمایید . همانطور که می دانید عدد 65 معادل اسکی حرف مد نظر ما است پس باید خانه فعلی حافظه را 65 واحد افزایش دهیم و بعد باید آن را چاپ نماییم برای این کار یک راه حل ساده این است که کد زیر را بنویسیم : ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ ++++++++++ +++++ . کد بالا خانه صفر حافظه را 65 واحد افزایش می دهد و بعد با استفاده از عملگر نقطه آن را چاپ می کند. حالا بیایید با دو عملگر دیگر در این زبان آشنا شویم براکتها : [ عملگری است که اگر مقدار خانه حافظه که اشاره گر به آن اشاره دارد صفر باشد اجرای برنامه را به بعد از ] منتقل می کند در غیر این صورت اجرا روند طبیعی خود را طی خواهد کرد. ] عملگری است که اگر مقدار خانه حافظه غیر از صفر باشد اجرای برنامه را به اولین خانه بعد از براکت باز منتقل می کند و در غیر این صورت برنامه از بعد از این عملگر ادامه پیدا خواهد کرد. بله درست متوجه شدید با استفاده از این دو عملگر می توان ساختارهایی مثل حلقه و شرط را پیاده سازی کرد. به عنوان اولین مثال بیایید کاری کنیم که خانه فعلی حافظه مقدارش صفر شود : [-] کد بالا به این صورت عمل می کند : اگر خانه فعلی حافظه صفر باشد اجرا به بعد از براکت بسته میرود در غیر این صورت یک واحد از خانه فعلی حافظه کسر می شود در براکت بسته اگر خانه فعلی صفر شده باشد اجرا به بعد از براکت بسته می رود در غیر این صورت اجرا به عملگر منفی می رود و یک واحد دیگر از خانه حافظه کسر می کند نتیجه ان است که تا زمانی که خانه فعلی حافظه صفر نیست در هر بار اجرای حلقه یک واحد از خانه حافظه کسر می شود تا اینکه خانه حافظه صفر شود و یعد اجرا به بعد از دستورات فوق می رسد. حال بیایید کد اول را با استفاده از یک حلقه نوشته و حرف “A” را چاپ نماییم : [-] > [-] +++++++++++++ [ < +++++ > - ] . و اما توضیح : ابتدا خانه اول حافظه را صفر می کنیم توجه داشته باشید قرار است مقدار خانه اول حافظه را 65 قرار دهیم پس اول جهت اطمینان مقدار ان را صفر می کنیم(خط 1). بعد به خانه دوم حافظه حرکت می کنیم ( خط 2).از خانه دوم حافظه می خواهیم به عنوان شمارنده استفاده کنیم پس آن را نیز صفر می کنیم ( خط 3 ).در مرحله بعد مقدار خانه دوم حافظه را برابر با 13 قرار می دهیم(خط 4) چون اگر حلقه ما 13 بار اجرا شود و در هر بار اجرا مقدار خانه اول را 5 واحد افزایش دهد حاصل خانه اول 65 می شود .خط 5 شروع حلقه ما است چون مقدار خانه دوم حافظه که هم اکنون اشاره گر به آن اشاره دارد برابر 13 است و صفر نیست پس اجرا به خط شماره 6 می رود حال به خانه اول حافظه بر می گردیم و در خط 7 پنج واحد ان را افزایش می دهیم حال کافیست مقدار شمارنده حلقه که در واقع خانه 2 حافظه است را یک واحد کاهش دهیم در خط شماره 8 به خانه دوم می رویم و در خط 9 یک واحد از آن کم می کنیم خط 10 برنامه اگر مقدار شمارنده یا خانه دوم حافظه که هم اکنون روی آن هستیم برابر صفر باشد به خط 11 می رود در غیر این صورت به [ رفته و حلقه یکباردیگر اجرا می شود.نهایتا وقتی شمارنده صفر شد به خط 11 برنامه می رویم و خروجی چاپ می شود که حرف “A” می باشد. در نهایت آخرین عملگر این زبان عملگر , است که خانه فعلی حافظه را از ورودی پر می کند معادل تابع GetChar() در cpp است. اگر هر سوالی در زمینه ی زبان برنامه نویسی برین فاک دارید، در همین تاپیک سوال خود را بپرسید. همچنین کتاب صوتی آموزش برین فاک در 20 دقیققه را از اینجا می توانید پیدا کنید. منبع : http://armanmnt.blogfa.com/post-33.aspx
  14. با سلام خدمت شما دوستان عزیز. امروز با آموزش چند زبانه کردن پروژه های یونیورسال در خدمت شما هستم خب بریم سراصل مطلب ! ابتدا یک فولدر به نام Strings در مسیر اصلی پروژه ی خودتان ایجاد کنید. سپس در همان فولدر (به اندازه ای که میخواهید زبان اضافه کنید که فعلا فارسی و انگلیسی مد نظر این آموزش است) فولدر های جدیدی اضافه کنید. این فولدر ها باید به نام کد زبان باشند. مثلا انگلیسی کد زبانش en-us است و اسم فولدر مربوطه را en-us بگذارید. در کنار آن فولدر فارسی به نام fa را نیز ایجاد کنید. ​داخل هر کدام ازین پوشه ها، یک فایل ریورس فایل به نام Resources.resw ایجاد کنید. (RightClick on folder>add>new item>resource file) خب ! 50 درصد کار پیش رفت حالا بریم سراغ XAML ! هر المنتی رو از رابط کاربری رو که میخاید چند زبانه باشه رو بهش یک x:Uid اختصاص بدید. ​ما برای مثال برای تگ Page و Button و تکست بلاک، Uid تعریف کردیم <Page x:Class="App2.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App2" x:Uid="page" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel VerticalAlignment="Center"> <TextBlock FontSize="24" x:Uid="matn" /> <TextBlock x:Name="matn2" FontSize="24" /> <Button x:Name="lang" x:Uid="lang" Click="Button_Click" Content="Language swicher" /> </StackPanel> </Grid> </Page> خب ! حالا بریم سراغ ریسورس ها. ​فقط لازم هستش که در هر سطر Uid هایی که برای المنت ها تعریف کردیم رو بنویسیم به همراه پراپرتی ای که میخواد تغییر کنه(مثال : matn.Text)، جلوش هم مقدارش به آن زبان. اگه هم دوست داشتید میتونید کامنت هم بنویسید. ​خب تبریک ! تا اینجای کار، زبان سیستم به هر کدام ازین دو زبان باشه، زبان اپلیکیشن هم از همون تبعیت میکنه. و اما نکات تکمیلی : خب ! ما تا الان تونستیم که فقط با استفاده از Xaml اپلیکیشن خودمون رو جند زبانه کنیمو ولی اگه بخایم از کد سی شارپ اقدام کنیم، باید این کار رو کنیم : 1-اضافه کردن Multilingual Toolkit ​برای این کار به مسیر پروژه کلیک راست کنید و add class و اسم کلاس رو MultilingualHelpToolkit.cs بگذارید. ​و اما درون این کلاس : class MultilingualHelpToolkit { //GetString("LanguageOptionsSubTitle","Text")l public static string GetString(string Title, string Property) { Windows.ApplicationModel.Resources.ResourceLoader loader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView(); var expected = loader.GetString(Title + "/" + Property); return expected; } public static FlowDirection GetObjectFlowDirection(string Title) { Windows.ApplicationModel.Resources.ResourceLoader loader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView(); var expected = loader.GetString(Title + "/FlowDirection"); if (expected.StartsWith("R") || expected.StartsWith("r")) return FlowDirection.RightToLeft; else return FlowDirection.LeftToRight; } public static bool IsApplicationLanguage(string Language) { if (GetApplicationLanguage() == Language) return true; else return false; } public static string GetApplicationLanguage() { return GetString("SelectedLanguage", "Text"); } } خب بعدش هر جا رو خواستید از طریق کد سی شارپ جند زبانه کنید این گونه عمل کنید : matn2.Text= MultilingualHelpToolkit.GetString("matn2", "Text"); درینجا، Matn2.Text در حقیقت المنتی در رابط است که ما میخواهیم در سی شارپ آن را چند زبانه کنیم ؛ توجه شود که مقادیر داخل پرانتر، اولی آن Uidو Text پراپرتی ای است که ما در ریسورس هایمان به آن مقداردهی کردیم. در حقیقت این تکه کد برای گرفتن مقدار از یک Uid و پراپرتی است که در ریسوس ها به آن مقدار دهی شده. ​و تشکر میکنم از سید علی نوشاهی برای توسعه ی MultilingualHelpToolkit نکته ی تکمیلی بعدی : چگونه از طریق اپلیکیشن روند تغییر زبان را در دست بگیریم ؟ خیلی ساده است ! var culture = new CultureInfo("fa"); ​//داخل پرانتز بالا، کد زبان مورد نظر را می نویسیم ApplicationLanguages.PrimaryLanguageOverride = culture.Name; CultureInfo.DefaultThreadCurrentCulture = culture; CultureInfo.DefaultThreadCurrentUICulture = culture; با این کد می توانید زبان اپ را تغییر دهید. ناگفته نماند که برای اعمال تغییرات به Restart اپلیکیشن نیاز است. امیدوارم که از این آموزشی استفاده برده باشید دریافت_سورس_کد_سمپل_این_آموزش
  15. با سلام خدمت شما دوستان عزیز . ​ضمن تبریک ایام الله دهه ی دهه ی فجر، امروز با آموزش ساخت یکی از مواردی خدمت شما هستم که خیلی در پیاده سازی بهینه ی UI میتونه موثر باشه. همچنین یکی از ارکان زبان طراجی جدید مایکروسافت (نعون) نیز هست. Blur ! آن هم روی هر چیزی. ابتدا در ویژوال استودیو یک پروژه ایجاد کنید. ابتدا این پروژه رو بگیرید : https://github.com/MahStudio/BackDrop و به سولوشن خود اضافه کنید. ​سپس به پروژه ی اصلی رفته، و رفرنس این پروژه را به پروژه ی اصلی اضافه کنید. خب! اصل کار رو پیش رفتیم. ​الان هر جا که بخواید این کنترل رو استفاده کنید، توی XAML سر پیج این رو اضافه کنید: xmlns:controls="using:MGS.Controls" خب حالا هرجا بلور خواستید این کد رو بنویسید : <controls:BackDrop BlurAmount="20" /> نکته ی 1 = در BlurAmount می توانید میزان بلور را مشخص کنید ​نکته ی 2 = هرچی زیر این کنترل باشه بلور میشه، تکرار میکنم ، هر چی ! و به صورت بهینه و بدون تاخیر اجرا میشه. ​ و این هم سمپل پروژه : https://github.com/MahStudio/BackDropTEST ​موید باشد
  16. سلام به همه میخوام برنامه نویسی رو شروع کنم و قبلا با دلفی توی دانشگاه کد مینوشتم و بعد از چند سال میخوام شروع کنم. تز کدوم زبان فرنامه نویسی شروع کنم و کدهایی که توی سی پلاس پلاس بلدم، توی ویژوال استودیو به کار میاد ؟! ففط میخوام یکی راهنمایی کنه که از کجا و با کدوم زفان برنامه نویسی باید شروع کنم. ممنون
  17. بسم الله سلام و عرض ادب خدمت عزیزان توی مطلب قبلی (آموزش ارسال پوش توسط OneSignal) چگونگی استفاده از سرویس OneSignal برای ارسال پوش نوتیفیکیشن رو مرور کردیم. بعد از انتشار مطلب متوجه شدیم که مایکروسافت ترتیبی داده که میشه از طریق داشبورد هم پوش انجام داد. توی این مقاله قصد دارم تا آموزش استفاده از این سرویس رو بنویسیم. ​چرا پوش از طریق مایکروسافت؟ ​این سرویس برای استفاده در پلتفرم یکپارچه ایجاد شده و بنابراین میتونید از همه نوع قالبهای موجود توست در ویندوز استفاده کنید. امکان شخصی سازی بسیار پیشرفته و حرفه ای ساخت اعلان به صورت تماما گرافیکی و آسان امکان تبدیل توست ساخته شده، به کد XML (برای استفاده در نرم افزار یا جای دیگر) امکان استفاده از کد XML برای ارسال پشتیبانی از پوش برای بروز رسانی کاشی ​چرا نه؟ بزرگترین و مهمترین دلیل این هست، که فقط و فقط میتونید، از طریق پنل اقدام به ارسال پوش کنید و فقط دستی! (درحالی که وان سیگنال امکان ساختن اتوماسیون رو از طریق api در اختیارتون قرار میده) همانطور که قبلا گفتم، این سرویس برای uwp ایجاد شده و متاسفانه فقط برای این پلتفرم قابل استفاده هست ​چگونه باید استفاده کرد؟ ابتدا باید ابزار توسعه سرویسهای استور رو دانلود کنید و روی سیستمتون نصب کنید. بعد از نصب، پروژه رو باز میکنیم و Referenceی به نام Microsoft Engagement Framework رو به پروژه اضافه میکنیم: ارسال پوش در همه سرویسها از طریق آدرسی به نام Channel URI ممکن میشه، که این آدرس به صورت دوره ای منقضی میشه و بنابراین باید در هر اجرا بررسی بشه که اگر منقضی شده آدرس جدید رو بگیریم و برای سرور ارسال پوش بفرستیم. ​برای اینکار فایل app.XAML.cs رو باز میکنیم و این namespace رو بهش اضافه میکنیم: using Microsoft.Services.Store.Engagement; بعدش هم در متد OnLaunched کد زیر رو برای درخواست و ثبت ChannelURI اضافه میکنیم: StoreServicesEngagementManager engagementManager = StoreServicesEngagementManager.GetDefault(); await engagementManager.RegisterNotificationChannelAsync(); و پایان!! الان کافیست از داشبورد اپلیکیشن مورد نظر رو انتخاب کنید و از قسمت Services گزینه Push Notifications رو انتخاب کنید و اقدام به ارسال کنید. اما این میتونه انتهای کار نباشه! شما میتونید چیزهای زیادی رو تعیین کنید، که به زودی در ادامه خواهم گفت! مثلا میتونید صفحه ای رو برای نمایش کامل جزئیات اعلان اختصاص بدید! موفق باشید!
  18. سلام به وین نویسی های عزیز، عصر پاییزیتون بخیر، امیدوارم که همیشه سر حال و سر زنده باشید. در این زمان از وین نویس، می خواهیم آموزش کار با انیمیشن ها را با همدیگر فرا بگیریم. دانلود کتاب این آموزش سورس کد این آموزش همچنین شما می توانید از این آموزش که یک آموزش به زبان انگلیسی است نیز استفاده نمایید: َAnimated navigation in Universal Apps سورس کد منبع: وین نویس
  19. سلام به وین نویسی ها، عصر پاییزیتون بخیر، امیدواریم سر حال باشید. پس از انتشار اولین نسخه از سورنا بعضی از دوستان از طریق تلگرام و ایمیل درخواست آموزش ساخت دیتابیس آنلاین رو دادند و اینکه چطوری میشه به دیتابیس سایتی که دارم متصل بشیم. در این آموزش شما به یک دامنه و یک هاست ویندوزی نیاز دارید. برای شروع شما می توانید از سایت زیر هاست ویندوزی را تهیه نمایید. نکته: هاست باید از MySQL پشتیبانی کند. نکته: شما باید گزینه Microsoft Web Developer Tools را نصب کرده باشید. دانلود کتاب الکترونیک آموزش دانلود پروژه UWP (برنامه) دانلود پروژه سایت (ASP) درون فایل فشرده پروژه سایت، دو تا فولدر وجود داره، برای باز کردن پروژه به پوشه Projects بروید و Win Nevis را انتخاب کنید و راه حل را با ویژوال استودیو باز کنید. چون ما پروژه را به صورت سایت ایجاد کردیم، فقط فایل راه حل درون Visual Studio 2015/Projects قرار میگیرد و تمامی کدها و کلاس هایمان درون پوشه Visual Studio 2015/WebSites قرار میگیرند. منبع: وین نویس
  20. سلام حتما نرم افزارهای زیادی رو توی استور دیدید که تبلیغات دارند داخلشون برای نمونه همین اپلیکیشن معروف 6tag که همیشه بالاش یک نوار مشکی و تبلیغات هست. امروز قرار هست که آموزش قرار دادن چنین تبلیغاتی رو توی نرم افزارهای یکپارچه 8.1 رو بگم که مراحلش برای ویندوز 10 و ویندوز و ویندوزفون یکی هست در حال حاضر تبلیغ کننده های مختلفی پشتیبانی میشن و میتونید از سرویسهاشون استفاده کنید که به ترتیب زیر هستن: سیستم تبلیغات مایکروسافت: با پشتیبانی پروژه یکپارچه ویندوز (ویندوز 10)، ویندوز 8.1، ویندوز فون 8.1، ویندوز فون 8.1 سیلورلایت، ویندوز فون 8 سیلور لایت سیستم AdDuplex: با پشتیبانی همه پلتفرم های بالا به جز پلتفرم یکپارچه (ویندوز 10). سیستم مجزایی دارن، ایران رو هم پشتیبانی میکنند اما تنها میتونید از تبلیغ در مقابل تبلیغ استفاده کنید. یعنی عوایدی جز تبلیغ برنامه تون نداره. برای عواید مالی ظاهرا دعوت نامه ایی هست. سیستم Smaato: با پشتیبانی مشابه سیستم AdDuplex. این سایت هم ایران رو پشتیبانی میکنه و میتونید پول دربیارید سیستم گوگل AdMob: با پشتیبانی ویندوز فون 8 و 8.1 سیلورلایت. مثل اکثر بخش ها دسترسی با ip ایران وجود نداره سیستم MobFox: پشتیبانی پلتفرم این سیستم هم مثل گوگل هست. این سیستم از ایران پشتیبانی نمیکنه سیستم InMobi: پشتیبانی مانند گوگل. این سرویس هم ایران رو پشتیبانی میکنه سیستم Inneractive: پشتیبانی این مورد هم مانند 3 سیستم قبلی. در این لحظه امکان تست این سیستم وجود نداشت نکته: در مواردی که بالا ذکر شد ایران رو پشتیبانی میکنند این هست که ظاهرا روشی دارند تا درآمدتون رو به حسابتون در ایران منتقل کنند اما اگر paypal داشته باشید کارتون ساده تر هست. نکته: سیستم مایکروسافت کمی متفاوت هست اما پول در همون حساب هست و میتونید از استور مستقیما خرید کنید یا اپ خودتون رو تبلیغ کنید. برای استفاده از سیستم مایکروسافت (که همین روش آموزش داده خواهد شد) به غیر از بخش کدنویسی و افزودن کنترل دارای تنظیماتی داخل بخش انتشار هست که زمانی که اپ رو میفرستید تنظیمات رو انجام میدین برای شروع نیاز داریم تا ابزار توسعه (SDK) مورد نیاز که Windows Ad Mediation نام داره رو دانلود و نصب کنیم. برای اینکار از این لینک اقدام کنید. این کیت توسعه 3 حالت برای تبلیغات در اختیار ما قرار میده: تبلیغات بنری تبلیغات ویدئویی ترکیب تبلیغات ویدئویی و بنری اگر قصد استفاده از تبلیغات بنری در محیط XAML دارید کار خاصی نیاز نیست اما برای ویدئو یا استفاده در HTML موارد دیگری لازم هست انجام بشه که درصورت نیاز آموزش داده خواهد شد. سایزهایی که قابل استفاده هستند به شکل زیر هستن: ویندوز فون: 300x50, 320x50, 480x80, 640x100 دسکتاپ و تبلت: 250x250, 300x250, 728x90, 160x600, 300xx600 یک پروژه جدید میسازیم که بنده پروژه یکپارچه رو برای اینکار انتخاب کردم داخل پروژه، در هر پلتفرمی به طور مجزا، روی References راست کلیک میکنیم و Add Reference رو میزنیم در پنجره باز شده، از سمت چپ Windows 8.1 و در زیر شاخه اون Extensions رو انتخاب کنید و Ad Mediator SDK for Windows 8.1 XAML رو تیک بزنید و اوکی کنید تا منابع مورد نیاز به پروژه تون اضافه بشه. بعد اگر به لیست خطا های ویژوال استادیو نگاهی بندازید، احتمالا چند خط اخطار یا Warning میبینید که با عوض کردن معماری پردازنده به چیزی غیر از Any CPU اخطارها از بین میرن. سپس صفحه اصلی یا MainPage.xaml رو باز میکنیم تا صفحه طراحی رو ببنیم و جایی برای تبلیغمون در نظر بگیریم و المان های مورد نیاز رو اضافه کنیم. از سمت چپ از منوی ابزارها یا toolbox و از بخش AdMediator کنترل AdMediatorControl رو به صفحه طراحی پروژه تون اضافه کنید. داخل کدها ویژگی نام برای راحتی استفاده در کد سی شارپ، اضافه شده و یک ویژگی ID هم وجود داره که برای هر کنترل یکتا هست، ابدا تغییرش ندید یا برای یک کنترل دیگه ازش استفاده نکنید. به طور مجزا در هر پلتفرم، روی پروژه راست کلیک کنید از پنجره Solution Explorer و از قسمت Add گزینه Connected Service رو انتخاب کنید. داخل پنجره ایی که باز میشه از سمت چپ Ad Mediator رو انتخاب کنید (اگر از ویژوال 2015 استفاده میکنید دکمه Configure رو بزنید) و روی Select Ad Network کلیک کنید و سیستم تبلیغاتی که مد نظرتون هست رو تیک بزنید و روی دکمه اوکی کلیک کنید. نکته: اگر به غیر مایکروسافت سیستم دیگه ای رو هم اضافه کنید مثل تصویر زیر شروع به دریافت ابزار توسعه مورد نیاز سیستم میکنه که بعد از اتمام کارش با اوکی پنجره رو ببندید بعد میبینید که سیستم ها به پنجره مربوطه اضافه شدن. روی هرکدوم کلیک کنید و دکمه Configure رو برای تنظیمات اولیه فشار بدید برای سیستم مایکروسافت تنظیم خاصی نیاز نیست اما در سیستم های دیگه باید کارهای دیگه ای انجام بدید و کدهایی که دریافت میکنید رو داخل تنظیمات وارد کنید. نکته: چنانچه تنظیم خاصی وارد نکنید در هنگام تست به طور خودکار تنظیمات آزمایشی اعمال میشود تا بتوانید در عمل نتیجه رو ببینید. نکته 2: مایکروسافت توصیه میکنه که همه شبکه هایی که درش حساب دارید رو اضافه کنید چون بعدا از مرکز توسعه (Dev Center)، تنظیمات مربوط به نحوه نمایش و اینکه با چه ترکیبی از هر سیستم استفاده کنه، رو میتونید تنظیم کنید برای استفاده از تبلیغات برخی دسترسی ها باید از طریق تب Capabilities در فایل Package.ppxmanifest باید باز شود در ویندوز و ویندوز 8.1 تنها دسترسی استفاده از اینترنت کافیست. به هر حال در تصویر قبلی دسترسی های مورد نظر نوشته شده که در صورت وجود نوشته ای غیر از Internet (Client) باید اون دسترسی ها رو هم اضافه کنید. تنظیماتی که برای تبلیغات وارد میکنید بعد از ارسال نرم افزار به طور خودکار در قسمت Monetize With Ads قابل مشاهده و تغییر هستند و این یعنی برای تغییر تنظیمات تبلیغتون لزومی برای انتشار آپدیت جدید وجود نداره. خب کارهای اصلی نمایش دادن تموم شده و نرم افزارتون آماده انتشار و نمایش تبلیغ و سرازیر کردن درآمد به جیب شماست! نرم افزارتون رو منتشر کنید و بعد از قسمت Monetization گزینه Monetize With Ads رو بزنید و تنظیمات رو انجام بدید تا مطمئن باشید تا تبلیغاتتون درست هست نکته مهم: این آموزش کپی یا ترجمه شده از سایت دیگری نیست و من هم تجربه استفاده از تبلیغات رو نداشتم و به علت نیاز کاربران گرامی تمامی مراحل رو شخصا انجام دادم و بررسی کردم و نتیجه اش شد آموزشی که پیش روتون هست، لطفا آموزش رو به احترام زحمتی که کشیده شده جایی کپی نکنید. ممنون دوستان خوبتون رو هم به انجمن دعوت کنید لطفا و در صورت تمایل انجمن رو در نرم افزارتون معرفی کنید سوالی اگر بود در قسمت سوالات و مشکلات، تاپیک جدیدی باز کنید و سوالتون رو مطرح کنید
  21. بسم الله الرحمن الرحیم. سلام؛ بعد از آموزش نصب ویندوز 10 روی رسپبری پای 3 (برای سایر بردها هم فرقی نمی کنه و به همین روش هست) اینبار می خواهیم یک برنامه ساده رو بنویسیم و روی برد اجرا کنیم. همونطور که می دونید هسته های سیستم عامل ویندوز 10 در دستگاه های مختلف یکسان هست و این به ما اجازه می ده تا با یک بار کد نویسی، یک برنامه برای پلتفرمهای مختلف مایکروسافت که شامل دسکتاپ، تبلت، کنسول، موبایل، هالولنز و اینترنت اشیاء می شود ایجاد کنیم. یعنی دقیقا همون برنامه ای رو که الان روی موبایلتون دارید رو می تونید روی رسپبری پای هم اجرا کنید. خب همونطور که حدس زدید از اونجا که برنامه نویسی یک پارچه است پس به SDK مربوطه علاوه بر ویژوال استدیو نیاز دارید. اکنون وقت آن است که برنامه رو بنویسم. در اینجا قصد ما آموزش برنامه نویسی نیست، چون تفاوت چندانی ندارد. اولین برنامه ما همان "سلام دنیا"ی معروف است که این بار می خواهیم بر روی رسپبری اجرا کنیم. خب، یه پروژه جدید با نام دلخواه باز کنید، و کدهای لازم رو هم بزنید. برای اینکه بتونید برنامه رو روی ویندوز 10 اینترنت اشیا نصب کنید لازمه اکستنش های اینترنت اشیاء رو به پروژه اضافه کنید. در منو Solution بر روی reference راست کلیک کرده و سپس به مسیر Add Reference > Universal Windows > Extensions برید و تیک Windows iot Extensions for uwp رو بزنید و اوکی کنید. توجه کنید که باید هر دو دستگاه در یک شبکه باشند. برای اینکه چک کنید رسپبری پای شما به شبکه متصل هست و سیستم شما می تونه اون رو پیدا کنه می تونید از برنامه Windows 10 IoT Core Dashboard که در مقاله قبل معرفی کردم استفاده کنید. برنامه رو اجرا کنید و به تب my devices برید. اگر دستگاه رو مشاهده کردید پس مشکلی وجود نخواهد داشت. در گام بعدی باید پلتفرم سولوشن رو ARM قرار بدیم: حالا دستگاه مورد نظر رو هم Remote Machine میزنیم: حالا باید اسمی رو که هنگام نصب ویندوز برای دستگاه انتخاب کرده بودید رو وارد کنید. توی داشبورد قسمت مای دیوایس می تونید اسم رو ببینید اگر فراموش کردید. Authentication.... رو هم مطابق تصویر univeral قرار بدید و روی Select کلیک کنید. در صورت وجود نداشتن مشکلی می تونید کلید F5 رو بزنید تا برنامه Deploy بشه و روی رسپبری نصب بشه. تمام.
  22. با سلام و عرض ادب. در این سری مقاله قصد داریم ضمن آشنایی شما دوستان عزیز با مبحث اینترنت اشیا، آموزش های لازم را نیز در اختیار شما قرار دهیم. در این قسمت میخواهیم شما را با پلتفرم های موجود برای توسعه ی اینترنت اشیا آشنا کرده و آنها را برسی کنیم. با ما همراه باشید. برای توسعه ی اینترنت اشیا چه پلتفرمی موجود است و چگونه باید روی آن کار کنم؟ در حال حاضر پلتفرم های گوناگونی برای توسعه ی اینترنت اشیا وجود دارند که هر کدام از شرکت ها سعی دارند با مطرح کردن آنها، آن را به استاندارد تبدیل کنند. گرچه هم اکنون هیچ استاندارد خاص و جامعی تعریف نشده است و هر توسعه دهنده ای می تواند استاندارد و پلتفرم خود را هم از نظر سخت افزاری و هم از نظر نرم افزاری توسعه دهد. برای شروع به کار می توانید سخت افزار های مورد نیازتان را طبق ایده ای که در ذهن دارید تهیه کنید و پس از انجام کار های سخت افزاری وارد کار های نرم افزاری شده و آن را توسعه دهید. اگر هم "فعلا" توسعه دهنده ی سخت افزاری نیستید می توانید از سخت افزار ها و ماژول های موجود استفاده کنید و با استفاده از زبان ها و بستر های برنامه نویسی به خصوص کار توسعه دهندگی را شروع کنید. برای این کار برد های مینی کامپیوتری بسیار گزینه ی جالبی هستند. توسعه دهنده ی نرم افزاری هستم و خیلی دانش سخت افزاری ندارم. چه پلتفرم هایی برای توسعه برای من مناسب است؟ پلتفرم هایی که برای توسعه ی نرم افزاری مناسب هستند قطعا آن هایی اند که سخت افزارشان آماده است! برد های مینی کامپیوتری زیادی برای همین منظور ساخته شده است که از معروف ترین آنها می توان به Raspberry Pi , DragonBoard , MinnowBoard,Intel Edison , Intel Jole و... اشاره کرد. حسن این برد ها در این است که سخت افزار آماده است و با اضافه کردن ماژول ها،شیلد ها، و برد های دیگر(نظیر آردونیو) به این برد ها کار های بسیار جالبی کرد. روی اکثر این برد ها توزیع هایی از سیستم عامل لینوکس قابل نصب است و برای برخی از آنها نیز هسته ی Windows 10 برای دستگاه های اینترنت اشیا عرضه شده است. بعضی از این برد ها هم سیستم عامل و بستر برنامه نویس مخصوص به خودشان را دارند. رسپبری(Raspberry) چیست؟ رسپبری پای یا رزبری پای یک کامپیوتر ارزان قیمت و هم اندازه یک کارت عابر بانک است که می تواند به مانیتور ها و تلویزیون متصل شود و همچنین می توان کیبورد و ماوس معمولی را نیز به آن متصل نمود. رسپبری پای یک دستگاه کوچک با توانایی های بالاست که افراد علاقه مند به کامپیوتر ها از هر سنی می توانند از آن استفاده کنند و لذت ببرند. همچنین می توان از رسپبری پای برای یادگیری چگونگی نوشتن یک برنامه برای کامپیوتر ها به زبان های مختلف مانند پایتون و اسکرچ استفاده نمود. رسپبری پای می تواند هر کاری که یک کامپیوتر دسکتاپ می تواند انجام دهد از مرور صفحات وب و پخش آهنگ و فیلم های HD گرفته تا نرم افزار های صفحه گسترده ، پردازش متن و تصویر و اجرای بازی را برای شما انجام دهد. اما رسپبری پای قابلیت منحصر به فرد دیگری نیز دارد. رزبری پای می تواند به سادگی به دستگاه های الکترونیکی دیگر متصل شود و با آنها در تعامل باشد و به تبادل اطلاعات با آنها بپردازد. طراحان سیستم های دیجیتال از رسپبری پای برای طراحی دستگاه های مختلفی از پروژه های کوچک گرفته تا پروژه های بزرگ استفاده می کنند. تیم رسپبری پای امیدوارند کودکان و نوجوانان با استفاده از رسپبری پای ، نحوه ی برنامه نویسی را بیاموزند و روش عملکرد کامپیوتر ها را درک کنند. رسپبری پای توسط بنیاد خیریه رسپبری پای ( Raspberry Pi Foundation ) در کشور انگلستان و با هدف توسعه دانش کامپیوتر در میان دانش آموزان ساخته شده است اما کاربرد رسپبری پای تنها به موارد آموزشی محدود نمی شود و تا کنون پروژه های تجاری بسیاری با این دستگاه کار آمد به انجام رسیده است. رسپبری پای در چند نسخه موجود است که از محبوب ترین آنها می توان به Raspberry pi 2 و Raspberry Pi 3 و Raspberry Pi Zero اشاره کرد. از ویژگی های چشمگیر این برد ها میتوان به قیمت کم( به ترتیب 130 ، 160 ، 40 هزار تومان) و در دسترس بودن ، توسعه ی نرم افزاری (روی تمامی آنها توزیع های مختلف لینوکس قابل تصب است و برای پای 2و3 ویندوز در دسترس است) و سخت افزاری (میتوان برد آردونیو و شیلد ها و ماژول های مختلفی را به این برد متصل کرد) ساده ، اندازه ی کوچک اشاره کرد. بهترین انتخاب کدام است؟چه چیز هایی را باید خریداری بکنم ؟ هیج بهترین انتخابی وجود ندارد! هر توسعه دهنده ای طبق نیاز ها و بودجه و ایده ی خود باید پلتفرم مورد نیاز خود را انتخاب کند. اما ما برای آموزش و شروع به کار برد رسپبری پای 3 به همراه ویندوز 10 IoT را پیشنهاد می کنیم. شما برای شروع به کار به یک برد رسپبری پای 3 + شارژر Micro USB یا کابل MicroUSB +موس و کیبرد+مانیتور و کایل HTMI (اگر مانیتور شما از HTMI پشتیبانی نمیکند میتوانید از تبدیل استفاده کنید) + کارت حافظه کلاس 10 یو1 (کارت حافظه ی Sandisk Class10 U1 16GB 88MBps پیشنهاد میشود) در کنار ویژوال استودیو 2015 آپدیت 2 به بعد به همراه Windows 10 SDK نیاز دارید. چکونه راه اندازی بکنم؟ آموزش راه اندازی رسپبری پای 3 به همراه ویندوز 10 را دوست عزیزم روح الله صابری در انجمن قرار داده است که میتوانید از آن استفاده کنید. https://www.win-nevis.com/topic/410-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%86%D8%B5%D8%A8-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-iot-%D8%B1%D9%88%DB%8C-%D8%B1%D8%B3%D9%BE%D8%A8%D8%B1%DB%8C-%D9%BE%D8%A7%DB%8C-2-%D9%88-3/ همچنین از مرجع توسعه دهندگان مایکروسافت نیز میتوانید استفاده کنید. https://developer.microsoft.com/en-us/windows/iot/GetStarted در ادامه با مقالات و آموزشی های بیشتری در خدمت شما خواهیم بود. پاسخگوی سوالات شما نیز هستیم. تهیه شده توسط محسن سیفی در وین نویس موید باشید
  23. به نام پروردگار یگانه سلام به وین نویسی ها، صبح جمعه پاییزیتون بخیر، امروز می خواهیم درباره نحوه ساخت چند پوسته کردن برنامه ها حرف بزنیم. ویندوز 10 به صورت پیشفرض از سه نوع تم یا پوسته پشتیبانی می کنه: تاریک، روشن و کنتراست بالا. Dark, Light and HighContrast به صورت پیشفرض نرم افزار شما پوسته تاریک را انتخاب می کند. برای تغییر این حالت کافی است فایل App.xaml را باز کرده و پراپرتی RequestedTheme را روی Dark قرار دهید: اینطوری نرم افزار شما به صورت پیشفرض میاد پوسته تاریک رو برای برنامه شما در نظر میگیره و رنگهایی که برای پوسته تاریک به صورت پیشفرض تعیین شده رو بارگذاری می کنه به نمایش در میاره. پروژه جدید ویندوز 10 ای به نام WN Application Themes ایجاد کنید. روی پروژه راست کلیک کرده و سپس به گزینه Add رفته و New Item را انتخاب کنید. درون پنجره باز شده Template را روی Resource Dictionary قرار داده و نام آنرا MyThemes گذاشته روی Add کلیک کنید: حال درون MyThemes.xaml خط زیر را حذف کنید: xmlns:local="using:WN_Application_Themes" حال کدهای زیر را درون بلاک ResourceDictionary بنویسید: <ResourceDictionary.ThemeDictionaries> <ResourceDictionary x:Key="Light"> <SolidColorBrush x:Key="FontColor" Color="#FF00232B" /> <SolidColorBrush x:Key="BackgroundColor" Color="#FFF0F0F0" /> </ResourceDictionary> <ResourceDictionary x:Key="Dark"> <SolidColorBrush x:Key="FontColor" Color="#FF838987" /> <SolidColorBrush x:Key="BackgroundColor" Color="#FF1B1B1B" /> </ResourceDictionary> </ResourceDictionary.ThemeDictionaries> یک ریسورس دیکشنری از نوع تم دیکشنری تعریف کردیم که مخصوص به استایل دهی به پوسته هاست. درون این دیکشنری دو دیکشنری به کلید واژه های Light و Dark تعریف کردیم. کلید واژه ها در اصل همان پوسته هایی هستند که ویندوز 10 از آن پشتیبانی می کند. درون این دیکشنری ها نیز ما دو رنگ انتخاب کردیم یکی برای رنگ فونت با کلید واژه FontColor یکی نیز برای رنگ پس زمینه با کلید واژه BackgroundColor. درون دیکشنری با کلید واژه Light تمامی رنگ هایی که می خواهید برای پوسته روشن داشته باشید را باید با کلید واژه ای تعیین کنید. درون دیکشنری با کلید واژه Dark نیز باید همین کار را با همان کلیدواژه های مساوی دیکشنری Light تعریف کنید. نکته: جز دیکشنری روشن و تاریک می توانید یک دیکشنری دیگر به نام HighContrast داشته باشید! نکته: فایل دیکشنری MyThemes.xaml برای این ایجاد شد تا شما بدانید چگونه می توانید رنگ هایی را به صورت پیشفرض و دلخواه خود برای کنترلی قرار دهید. اکنون باید این فایل برای فایل App.xaml بشناسید که به عنوان یک دیکشنری ادغامی آنرا بشناسد. پس فایل App.xaml را باز کرده و کدهای زیر را درون آن بنویسید: <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="MyThemes.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> نکته: Source مکان فایل دیکشنری تم شما را تعیین می کند. چنانچه آنرا درون پوشه ای قرار داده اید باید نام پوشه را نیز بنویسید. مثلا اگر این فایل درون پوشه Assets باشد، Assets/MyThemes.xaml را باید درون Source بنویسید. حال Ctrl+Shift+S را بزنید تا تمامی فایل هایی که ایجاد کردید ذخیره گردند. حال کلاس جدیدی به نام Helper ایجاد کنید: فضاهای نامی زیر را در قسمت فضاهای نامی این کلاس بنویسید: using Windows.Storage; using Windows.UI.Xaml; حال کلاس آنرا به این صورت بنویسید public class Helper { public static ElementTheme CurrentTheme; public const string AppThemeConstant = "AppThemeConstant"; public static object LoadSettings(string key) { if (!ApplicationData.Current.LocalSettings.Values.ContainsKey(key)) return null; else return ApplicationData.Current.LocalSettings.Values[key]; } public static void SaveSettings(string key, object value) { if (!ApplicationData.Current.LocalSettings.Values.ContainsKey(key)) ApplicationData.Current.LocalSettings.Values.Add(key, value); else ApplicationData.Current.LocalSettings.Values[key] = value; } public static void RevertRequestedTheme(FrameworkElement fe, ElementTheme theme) { fe.RequestedTheme = theme; CurrentTheme = theme; } } این کلاس برای ذخیره سازی و تنظیم تم به کار می رود. حال این کلاس را ذخیره کرده و آنرا ببندید. فایل App.xaml.cs را باز کنید. درون Constructorـه این کلاس، کد زیر را بالای this.InitializeComponent بنویسید: SetTheme(); حال تابع آنرا نیز بنویسید: private void SetTheme() { object obj = Helper.LoadSettings(Helper.AppThemeConstant); if (obj != null) { try { ApplicationTheme theme = (ApplicationTheme)Enum.Parse(typeof(ApplicationTheme), obj as string); App.Current.RequestedTheme = theme; if (theme == ApplicationTheme.Dark) Helper.CurrentTheme = ElementTheme.Dark; else Helper.CurrentTheme = ElementTheme.Light; } catch { Helper.CurrentTheme = ElementTheme.Default; } } } مقدار LoadSettings در کلاس Helper مقداری را که در آن ذخیره شده است را از نوع Object بازگردانی می کند. بررسی می کنیم که چنانچه obj برابر با null نبود یعنی مقدار دارد. حال با استفاده از obj که نوع آن string است (در قسمت MainPage توضیح داده میشود)را با استفاده از کد Parseـه Enumerateها به Enumeratـه ApplicationTheme تبدیل می کنیم. سپس مقدار آنرا برابر با App.Current.Theme قرار میدهیم با این کار پوسته پیشفرض برنامه به چیزی که ذخیره شده است تبدیل می شود. حال بررسی می کنیم که چنانچه پوسته Dark بود مقدار CurrentThemeـه درون Helper که از نوع ElementTheme است را تاریک کند، در غیر اینصورت آنرا برابر با تاریک قرار دهد. سوال: چرا از try…catch استفاده شد؟ Enumـه ApplicationTheme دارای دو پوسته بیشتر نیست یکی روشن و تاریک، یعنی خبری از Default نیست اما در Enumـه ElementTheme علاوه بر اینکه تاریک و روشن وجود دارد Default نیز است که چنانچه در هنگام Parseـه Enumـه ElementTheme به ApplicationTheme مقدار Default باشد Excetion(استثنا) رخ می دهد که مقدار Default در این Enumerate وجود ندارد. پس درون catch مقدار CurrentTheme را روی Default قرار میدهیم. اکنون فایل MainPage.xaml را باز کنید و کدهای زیر را درون آن قرار دهید: <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="120" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBlock Text="Choose theme" VerticalAlignment="Center" HorizontalAlignment="Center" /> <ComboBox x:Name="cmbTheme" Grid.Column="1" SelectedIndex="0" VerticalAlignment="Center" HorizontalAlignment="Center" SelectionChanged="cmbTheme_SelectionChanged"> <ComboBoxItem Content="Default" /> <ComboBoxItem Content="Dark" /> <ComboBoxItem Content="Light" /> </ComboBox> </Grid> <Button x:Name="button" Content="استایل پیشفرض" HorizontalAlignment="Left" Margin="23,27,0,0" Grid.Row="1" VerticalAlignment="Top" /> <Button x:Name="button1" Content="استایل تعیین شده" HorizontalAlignment="Left" Background="{ThemeResource BackgroundColor}" Foreground="{ThemeResource FontColor}" Margin="23,71,0,0" Grid.Row="1" VerticalAlignment="Top" /> </Grid> به دکمه ها نگاه کنید. دکمه "استایل پیشفرض" دارای Background و Foregroundـی است که ما درون فایل MyThemes.xaml قرار داده ایم است. حال تابع رویداد SelectionChangedـه ComboBox را درون MainPage.xaml.cs بنویسید : private void cmbTheme_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (cmbTheme.SelectedIndex != -1) { ComboBoxItem cbi = cmbTheme.SelectedItem as ComboBoxItem; if (cbi != null) { try { ElementTheme theme = (ElementTheme)Enum.Parse(typeof(ElementTheme), (string)cbi.Content); Helper.CurrentTheme = theme; Helper.RevertRequestedTheme(this, theme); Helper.SaveSettings(Helper.AppThemeConstant, theme.ToString()); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("ex: " + ex.Message); } } } } بررسی می کنیم چنانچه مقدار SelectedIndexـه Combo برابر با منفی یک نبود(یعنی آیتمی انتخاب شده بود) شرط درست است. حال متغیر SelectedItem را چون از نوع ComboBoxItem درون XAML تعیین کردیم cast می کنیم سپس بررسی می کنیم که مقدار cbi برابر با null نباشد. اکنون با استفاده از پراپرتی Contentـه ComboBoxItem که از نوع object است، مقدار cast شده Content را به صورت رشته در می آوریم و آنرا به صورت Enumerateـه ElementTheme، پارس Parse می کنیم. سپس مقدار CurrentTheme را برابر با همین پوسته قرار می دهیم. حال در خط بعد تابع RevertRequestedTheme را با دو پارامتر ورودی this و theme می نویسیم. این کار برای اعمال تم جدید به صورت آنی است. نکته: چون در زمان اجرا، پوسته را تعیین کردیم نمی توانیم پوسته را برای تمامی صفحات با استفاده از کد زیر اعمال کنیم: App.Current.RequestedTheme = theme; چنانچه این کار را انجام دهیم برنامه Exception خواهد داد! چون این فقط و فقط یکبار آن هم در اجرای تابع Constructorـه App.xaml.cs میشود به آن مقدار داد. برای رفع این مشکل کافی است تابع باز نویسی شده OnNavigatedTo درون صفحات را بنویسید و کد زیر را درون آن قرار دهید: Helper.RevertRequestedTheme(this, Helper.CurrentTheme); یعنی: protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); Helper.RevertRequestedTheme(this, Helper.CurrentTheme); } در آخر نیز مقدار theme را به صورت رشته در می آوریم تا نام پوسته را ذخیره کنیم و بعدا که برنامه بسته و باز شد، آنرا بارگذاری کرده و از طریق آن پوسته را انتخاب کنیم. به همین سادگی و خوشمزگی! کتاب الکترونیک این آموزش + سورس کد پروژه پیوست شد. امیدوارم همچنان همراه ما باشید... . منبع: وین نویس Application Multiple Themes Sample.zip Application Theme.pdf
  24. به نام پروردگار یگانه سلام فراوان خدمت تمامی وین نویسی ها، امیدوارم حالتون خوب باشه. چندی پیش داخل تاپیک های انجمن در مورد پرداخت های درون برنامه ای بعضی از دوستان سوالاتی پرسیده بودند که البته حسام کاشفی عزیز آموزش جامعی رو درباره روش کسب درآمد از فروشگاه مایکروسافت رو توضیح داده، این آموزش رو می تونید از آدرس زیر فرا بگیرید: آموزش کسب درآمد از ویندوز استور در این آموزش، شما با استفاده از درگاه زرین پال می توانید برای نرم افزار خود یک پرداخت درون برنامه ای کوچک راه اندازی کنید. مواردی که شما باید پیش از آنها داشته باشید: 1. مرچنت کد زرین پال(کد درگاه پرداخت): کدی یکتا و 36 کاراکتری است که زرین پال به ازای هر درخواست درگاه پرداخت به پذیرنده اختصاص می دهد. 2. سایتی برای خودتان 3. ویژوال استودیو 2015 + SDK ویندوز 10 نکته: این آموزش بر روی ویندوز/فون 8.1 عملی نیست، برای عملی کردن این آموزش برای ویندوز/فون 8.1 شما باید وبسایتی با هاست ویندوزی تهیه کنید و با استفاده از ASP برای خود واسطه ای ایجاد نمایید تا بتوانید در ویندوز/فون 8.1 از وب سرویس استفاده کنید. خب چنانچه هنوز در زرین پال عضو نشده اید می توانید از طریق لینک زیر استفاده کنید: عضویت در زرین پال نکته: شاید برای اولین بار که عضو زرین پال می شوید یا درگاه سفارش میدهید، باید تمامی اطلاعات خود اعم از کپی کارت ملی(عکس از کارت ملی نیز بگیرید قابل قبول است) ، سن و ... را وارد نمایید. پس از تایید زرین پال و ساخت کیف پول برای شما: برای درخواست درگاه زرین پال بعد از عضویت به پنل کاربری خود رفته و در منو سمت راست گزینه درگاه های پرداخت را انتخاب کنید. در این صفحه روی "درخواست درگاه پرداخت" کلیک کنید. اطلاعات بالا را باید تکمیل و ثبت نمایید. نکته: هر سایت فقط می تواند یک درگاه پرداخت داشته باشد. نکته: فرض کنید شما یک وبسایت با هاست لینوکسی دارید اکنون یک وبسایت با هاست ویندوزی ایجاد کرده اید اما چیزی جز کدهای ASP نمی خواهید در هاست جدید خود داشته باشید، زرین پال برای اینکه به شما درگاه پرداخت دهد سایت شما باید نوشته ای یا کالایی را در خود داشته باشد، پس اگر برای سایت جدیدتان درخواست دهید 100% از شما می خواهند که سایت شما باید اطلاعاتی داشته باشد. راه آسانتر این است که درگاه پرداخت سایتی که در آن اطلاعات یا کالایی را در اختیار دیگران قرار می دهد استفاده کنید(اگر درگاه ندارد برای همین سایت درگاه سفارش دهید). به صورت پیشفرض گزینه "با محدودیت آی پی" برای درگاه های شما فعال است، شما باید در تنظیمات مربوط به درگاه پرداخت خود، گزینه "بدون محدودیت آی پی" را برای درگاه خود انتخاب کنید: خب پس از ساختن درگاه توسط زرین پال، در صفحه "درگاه های پرداخت" درگاه هایی که دارید برای شما نمایش داده می شود: خب این صفحه را باز گذاشته یا کد درگاه پرداخت مربوطه را در NotePad کپی کنید. پروژه ویندوز 10ـیه جدیدی به نام WN ZarinPal Payment ایجاد نمایید. پس از ساخت پروژه، صفحه طراحی MainPage.xaml را باز کنید و کدهای زیر را در آن بنویسید: <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="2.5*" /> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <TextBox x:Name="txtAmount" VerticalAlignment="Top" HorizontalAlignment="Stretch" InputScope="Number" PlaceholderText="Type your price to pay..."/> <Button x:Name="btnPay" Content="Pay" Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Center" Click="btnPay_Click" /> <WebView x:Name="webView" Grid.ColumnSpan="2" Visibility="Collapsed" NavigationCompleted="webView_NavigationCompleted" /> </Grid> تکست باکس برای تعیین مقدار پول پرداختی است. نکته: پولی که قرار است کاربر پرداخت کند بر اساس تومان است. کنترل وب ویو نیز برای پرداخت کردن است. خب حال در پنجره راه حل یا Solution Explorer روی References راست کلیک کرده و گزینه Add Service Reference… را انتخاب نمایید: صفحه برای شما باز خواهد شد: آدرس زیر، برای وب سرویس زرین پال استفاده می شود، آنرا باید در قسمت Address صفحه ای که باز شده است بنویسید و روی Go کلیک کنید: https://www.zarinpal.com/pg/services/WebGate/wsdl این آدرس از کتاب مستندات فنی اتصال به وب سرویس زرین پال گرفته شده است! آدرس کتاب: https://github.com/SamanSystems/Zarinpal-Gateway-Documentation/archive/master.zip سپس تکست Namespace را حذف کرده و کلمه ZarinPal را در آن بنویسید و روی OK کلیک کنید: حال صفحه کدنویسی MainPage.xaml.cs را باز کنید و فضای نامی زیر را در فضاهای نامی بنویسید: using WN_ZarinPal_Payment.ZarinPal; در بالای Constructorـه MainPage کدهای زیر را بنویسید: string merchantCode = "YOUR MERCHANT CODE"; string authority = string.Empty; int amount = 0; string description = string.Empty; string email = string.Empty; string mobile = string.Empty; string callBackUrl = "https://www.win-nevis.com/app/payment.txt"; MerchantCode: کدی یکتا و 36 کاراکتری است که زرین پال به ازای هر درخواست درگاه پرداخت به پذیرنده اختصاص می دهد. Authority: شناسه یکتایی که سایت زرین پال به ازای هر درخواست خرید، به پذیرنده ارسال می کند، این شناسه 36 کاراکتر دارد. Amount: مبلغ پرداختی است. این مبلغ بر حسب تومان است. کمترین میزان پرداختی 100 تومان است.(البته اگه اشتباه نکنم) Description: توضیحات تراکنش متنی است که توسط پذیرنده تعیین می شود که نشان دهنده خلاصه محصول یا سرویسی است که پذیرنده قصد فروش آنرا دارد.(منظور از پذیرنده خودتان هستید!) Email: ایمیل خریدار است که توسط پذیرنده در وب سرویس تعیین می شود که جهت سهولت در پیگیری های پس از پرداخت استفاده خواهد شد( این پارامتر اختیاری است). Mobile: شماره تماس خریدار است که توسط پذیرنده وب سرویس تعیین می شود که جهت سهولت در پیگیری های پس از پرداخت استفاده خواهد شد( این پارامتر اختیاری است). CallbackUrl: آدرسی که بعد از پایان عملیات در سمت زرین پال، خریدار به آنجا بازگشت داده می شود. در اینجا یک فایل Textـه خالی در سایت وین نویس آپلود شده است که پس از پرداخت به آن ارجاع داده شود. تابع ShowMessage را بنویسید. این تابع برای نمایش پیغام هاست. async private void btnPay_Click(object sender, RoutedEventArgs e) { description = "امتحان درگاه پپرداخت"; int.TryParse(txtAmount.Text, out amount); if (amount < 100 || string.IsNullOrEmpty(merchantCode) || string.IsNullOrEmpty(description) || string.IsNullOrEmpty(callBackUrl)) return; PaymentGatewayImplementationServicePortTypeClient zp = new PaymentGatewayImplementationServicePortTypeClient(); PaymentRequestResponse response = await zp.PaymentRequestAsync(merchantCode, amount, description, email, mobile, callBackUrl); authority = response.Body.Authority; if (response.Body.Status == 100) { webView.Visibility = Visibility.Visible; webView.Navigate(new Uri("https://www.zarinpal.com/pg/StartPay/" + authority)); } else ShowMessage("There is a problem in creating authority code.\r\nStatus code: " + response.Body.Status); } متغیر zp که از نوع PaymentGatewayImplementationServicePortTypeClient برای درخواست به وب سرویس زرین پال ساخته شده است. اما سوالی که باقی می ماند این است که این کلاس چگونه ایجاد شده است؟[K هنگامی که در قسمت Add Service Reference وب سرویس زرین پال را اضافه کردیم، ویژوال استدیو به صورت خودکار کلاس های مورد نیازی را که برای ما لازم است با استفاده کد XMLـی که درون آن آدرس وجود داشت ایجاد کرد. متغیر response را با استفاده از تابع PaymentRequestAsync ایجاد کردیم، در این تابع مرچنت کد، هزینه پرداختی، توضیحات، موبایل، ایمیل و آدرس بازگشتی به عنوان پارامتر های ورودی است که مقدار بازگشتی آن از نوع PaymentRequestResponse خواهد بود. درون این متغیر، داده ای به عنوان Body وجود دارد که دارای Authority و Status است. Status وضعیت تراکنش را نشان می دهد. اگر وضعیت برابر با صد بود یعنی درگاه با موفقیت کد Authority را ایجاد کرده و شما می توانید به صفحه شروع پرداخت بروید، شما می توانید معانی کدهای وضعیت ها را در صفحه آخر کتاب "مستندات فنی اتصال به وب سرویس زرین پال" مطالعه نمایید. اگر وضعیت برابر با صفر بود، وب ویو را نمایش می دهیم و سپس آدرس https://www.zarinpal.com/pg/StartPay/ + کد authority را باز می کنیم. چنانچه وضعیت برابر با صد نبود پس خطایی را به کاربر نمایش میدهیم. حال باید تابع رویداد NavigationCompletedـه وب ویو را بنویسیم: async private void webView_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args) { // آدرس فعلی ای که وب ویو در آن است string myUrl = sender.Source.ToString(); if (myUrl.Contains(callBackUrl)) { sender.Visibility = Visibility.Collapsed; PaymentGatewayImplementationServicePortTypeClient zp = new PaymentGatewayImplementationServicePortTypeClient(); PaymentVerificationResponse response = await zp.PaymentVerificationAsync(merchantCode, authority, amount); if (response.Body.Status == 100) ShowMessage("Purchase succeed.\r\n RefId in case you need: " + response.Body.RefID); else ShowMessage("There is a problem while purchasing...\r\nStatus code: " + response.Body.Status); } } خب در خط اول این تابع، آدرسی که وب ویو در آن است را با استفاده از مقدار Sourceـه وب ویو میگیریم. سپس شرط می گذاریم چنانچه قسمتی از مقدار این آدرس برابر با آدرس بازگشتی ما بود، شرط درست است. درون بلاک شرط اولین کاری که می کنیم این است که وب ویو را پنهان می کنیم. متغیری از نوع PaymentGatewayImplementationServicePortTypeClient ایجاد می کنیم چون باید پس از پرداخت حتما پرداخت توسط زرین پال تایید گردد. تابع PaymentVerificationAsync برای تاییدیه گرفتن از زرین پال است، این تابع دارای سه پارامتر ورودی است که به ترتیب کد مرچنت، authority مربوط به همین پرداخت و هزینه مربوط به همین را باید در آن وارد کنیم. نوع جواب PaymentVerificationResponse است که دارای متغیری از نوع Body است که این متغیر نیز دو متغیر دیگر در خود دارد، یکی Status یا وضعیت(اگر صد باشد پرداخت با موفقیت انجام شده است)، یکی RefId. RefId: شناسه یکتایی که زرین پال بعد از اتمام موفق تراکنش به پذیرنده می دهد. این شناسه جهت پیگیری های مالی استفاده می گردد. عکس ها: کتاب الکترونیک این آموزش + سورس کد پروژه پیوست شد. امیدوارم همچنان همراه ما باشید... . منبع: وین نویس In App Purchase Sample.zip Zarinpal Payment (In App Purchase).pdf
  25. در این ساعت از وین نویس با آموزش کنترل SemanticZoom با ما همراه شوید... بدون مقدمه به سراغ آموزش میرویم... SemanticZoom دو پراپرتی درونی داره به نام ZoomedInView و ZoomedOutView که اولی با GridView و دومی با ListView پُر میشه، و به ترتیب اولی کنترل هایی هست که کاربر می بینه(بزرگنمایی) و دومی هم کلید واژه ها(کوچک نمایی) است. ساختاری اون به شکل زیر می باشد ​ <SemanticZoom> <SemanticZoom.ZoomedInView> <!-- Put the GridView for the zoomed out view here. --> </SemanticZoom.ZoomedInView> <SemanticZoom.ZoomedOutView> <!-- Put the ListView for the zoomed in view here. --> </SemanticZoom.ZoomedOutView> </SemanticZoom> خب پروژه جدیدی یکپارچه ای به نام WN SemanticZoom ایجاد کرده و پس از آن یک کلاس به نام MyType.cs درون پروژه ایجاد کنید. سپس مقادیر این کلاس به شکل زیر در آورید: public class Item { public string Name { get; set; } public string Key { get { return Name.Substring(0, 1).ToUpper(); } } } public class ItemCategory { public string Key { get; set; } public string Name { get; set; } public List<Item> Items { get; set; } } کلاس Item در واقع آیتم هایی است که کاربر به صورت پیشفرض درون ZoomedInView می بیند خواهد بود. متغیر Name نامی که به کاربر نشان می خواهیم داده شود است و متغیر Key در واقع کلید واژه نام است که کاراکتر اول نام را میگیرد و حرف آنرا بزرگ می کند. کلاس ItemCategory همانطور که از نامش پیداست برای دسته ها می باشد. این کلاس برای این ایجاد شده است تا زمانی که ما با استفاده از LINQ لیستی از آیتم ها را داریم آنها را مرتب سازی کنیم تا بتوانیم هر دسته را ایجاد کنیم. دسته بندی نیز دارای نام است و یک کلید واژه و لیستی از کلاس آیتم. اما چرا باید لیستی از کلاس آیتم داشته باشد؟ برای مثال نام های زیر را در نظر بگیرد: Alireza Ahmad Mehrdad Mahyar Raha Arman Arian در لیست بالا سه کلید واژه وجود دارد، یکی A که دارای چهار اسم علیرضا، احمد، آرمان و آرین است، کلید واژه M که دارای اسامی مهرداد و مهیار است و کلید واژه R که دارای اسم رها است. هر دسته بندی کلید واژه را میگیرد و لیستی از اسم ها را که با یک کلید واژه مشابه هم هستند، به صورت لیست در می آورد. پس در اصل اسامی بالا را بدین شکل باید فرض کنید: A Ahmad Alireza Arian Arman M Mahyar Mehrdad R Raha حال صفحه MainPage.xaml را باز کنید و در قسمت ریسورس صفحه کد زیر را قرار دهید: <Page.Resources> <CollectionViewSource x:Name="groupItemsViewSource" IsSourceGrouped="true" ItemsPath="Items" /> </Page.Resources> این لیست برای بایند کردن به GridViewـه ZoomedInView می باشد. پس درون سی شارپ هرگاه به متغیر Sourceـه این کالکشن، اضافه شود، در اصل به GridViewـی که درون ZoomedInView است اضافه می شود. درون کنترل Grid اصلی صفحه کنترل SemanticZoomـی اضافه کنید و نام آنرا mySemanticZoom بگذارید. حال رویداد ViewChangeStarted را برای این کنترل ایجاد کنید. این رویداد را ما باید هندل کنیم، زمانی که لیست کلید واژه ها می آید، چنانچه این رویداد هندل نشده باشد اگر روی کلید واژه کلیک کنیم هیچ اتفاقی نخواهد افتاد.(بعدا کدهای سی شارپ این رویداد را خواهیم نوشت). <SemanticZoom x:Name="mySemanticZoom" ViewChangeStarted="mySemanticZoom_ViewChangeStarted"> </SemanticZoom> هم اکنون زمان آن است که برای دسته بندی ZoomedOutView کنترل GridViewـی ایجاد کنیم و با استفاده از ItemTemplate برای آیتم های آن یک Template ایجاد کنیم که نام کلید واژه در آن قرار بگیرد. درون بلاک SemanticZoom کدهای زیر را بنویسید: <SemanticZoom.ZoomedOutView> <GridView x:Name="gridViewKeys" SelectionMode="None"> <GridView.ItemTemplate> <DataTemplate> <Grid Height="75" Width="75" Background="#FF343434" HorizontalAlignment="Center" VerticalAlignment="Center"> <!--واژه کلید--> <TextBlock Text="{Binding Key}" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" /> </Grid> </DataTemplate> </GridView.ItemTemplate> </GridView> </SemanticZoom.ZoomedOutView> GridView ای به نام gridViewKeys ایجاد کردیم و مقدار SelectionMode آنرا برابر با None قرار دادیم که آیتم های آن قابل انتخاب شدن نباشد. سپس با استفاده از GridView.ItemTemplate برای این کنترل، تمپلیتی ایجاد کردیم. درون آن یک Grid به کار برده شد به طول و عرض 75 و رنگ پس زمینه تیره. درون این Grid یک کنترل TextBlock قرار دادیم و مقدار Textـه آنرا برابر با مقدار بایند شده Key قرار دادیم. حال باید برای ZoomedInView نیز کارهایی انجام دهیم. کدهای زیر را به بلاک SemanticZoom اضافه کنید: <SemanticZoom.ZoomedInView> <GridView x:Name="gridViewItems" ItemsSource="{Binding Source={StaticResource groupItemsViewSource}}" SelectionMode="None"> <GridView.ItemTemplate> <DataTemplate> <Grid Background="#FF0C0C0C" Height="130" Width="100"> <TextBlock TextWrapping="Wrap" Text="{Binding Name}" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" /> </Grid> </DataTemplate> </GridView.ItemTemplate> <GridView.GroupStyle> <GroupStyle HidesIfEmpty="False"> <GroupStyle.HeaderTemplate> <DataTemplate> <!--واژه کلید--> <TextBlock FontSize="20" Text="{Binding Key}" Foreground="#FF007E83" Margin="15,0,0,0" /> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </GridView.GroupStyle> </GridView> </SemanticZoom.ZoomedInView> GridViewـیی به نام gridViewItems ایجاد کردیم و ItemsSourceـه آنرا با استفاده از بایند کردن، به کاکشنی که ریسورس صفحه قرار دادیم بایند کردیم. ItemTemplateـی نیز برای آن اختصاص دادیم که نام افراد را به نمایش در آورد. در این GridView، تنظیماتی برای GroupStyle یا استایل دهی گروه ها نیز انجام دادیم. مقدار HidesIfEmpty را برابر با False قرار دادیم چرا که نمی خواهیم زمانی که گروهی خالی بود آنرا مخفی کند. درون این GroupStyle باید Templateـه Header را تغییر دهیم، این همان کلید واژه هایی خواهد بود که در بالای دسته ها نمایش داده می شوند. مقدار Key را درون این Template بایند می کنیم. حال صفحه MainPage.xaml.cs را باز کنید تا چند خطی نیز سی شارپ کار کنیم... تابع رویداد ViewChangeStartedـه کنترل SemanticZoom: private void mySemanticZoom_ViewChangeStarted(object sender, SemanticZoomViewChangedEventArgs e) { if (e.SourceItem.Item == null) return; if (e.IsSourceZoomedInView == false) e.DestinationItem = new SemanticZoomLocation { Item = e.SourceItem.Item }; } چنانچه مقدار SourceItem.Item برابر با null بود باقی کدها را نخوان. چنانچه IsSourceZoomedInView برابر با False بود، یعنی در حالت ZoomedOutView بودیم، مسیر آیتم را به مکلنی جدید تغییر میدهیم. حال درون Constructorـه صفحه رویداد Loadedـه صفحه را ایجاد کنید: public MainPage() { this.InitializeComponent(); Loaded += MainPage_Loaded; } تابع آن: private void MainPage_Loaded(object sender, RoutedEventArgs e) { List<Item> items = new List<Item>(); items.Add(new Item { Name = "Arman Heydari" }); items.Add(new Item { Name = "Kamran Dehghan" }); items.Add(new Item { Name = "Ramin Mazloomi" }); items.Add(new Item { Name = "Abolfazl Hoshmand" }); items.Add(new Item { Name = "Raha Ilani" }); items.Add(new Item { Name = "Sepehr Divand" }); items.Add(new Item { Name = "Reza Farahani" }); items.Add(new Item { Name = "Akbar Majedi" }); items.Add(new Item { Name = "Amir Hossein Adib" }); items.Add(new Item { Name = "Atila Boromand" }); items.Add(new Item { Name = "Ziba Khobkar" }); items.Add(new Item { Name = "Iran Irani" }); items.Add(new Item { Name = "C# Programmer" }); items.Add(new Item { Name = "Win Nevis" }); List<ItemCategory> categoriesList = new List<ItemCategory>(); // sorted list var sortedList = items.OrderBy(it => it.Key).GroupBy(it => it.Key); foreach (IGrouping<string, Item> item in sortedList) categoriesList.Add(new ItemCategory() { Key = item.Key, Items = item.ToList() }); groupItemsViewSource.Source = categoriesList; gridViewKeys.ItemsSource = categoriesList; } لیستی از نوع Item ایجاد کردیم، و چندین اسم را به آن اضافه کردیم. سپس لیستی از ItemCategory ایجاد کردیم. با استفاده از LINQ آیتم ها را بر اساس کلید واژه های آن مرتب سازی می کنیم (soortedList) سپس با حلقه درون لیست مرتب سازی شده میگردیم و آنها را به لیست دسته بندی هایمان اضافه می کنیم. در آخر نیز لیست دسته بندی هایمان را به Sourceـه groupItemsViewSource و ItemsSourceـه gridViewKeys می دهیم. به همین سادگی و خوشمزگی! PDF + پروژه این آموزش پیوست شد. منبع: وین نویس SemanticZoom Sample.zip Windows 10 Introduction S01 SemanticZoom.pdf