پرچمداران

  1. NGame

    NGame

    توسعه دهنده


    • امتیاز: پسندیدن

      23

    • تعداد ارسال ها

      19


  2. ryco

    ryco

    مدیر کل


    • امتیاز: پسندیدن

      9

    • تعداد ارسال ها

      240


  3. vkazi

    vkazi

    توسعه دهنده


    • امتیاز: پسندیدن

      6

    • تعداد ارسال ها

      1


  4. Hesam_007

    Hesam_007

    توسعه دهنده


    • امتیاز: پسندیدن

      6

    • تعداد ارسال ها

      25



مطالب محبوب

در حال نمایش بیشترین مطالب پسند شده از زمان سه شنبه, 27 تیر 1396 در همه بخش ها

  1. 7 پسند
    با سلام در این آموزش با مقدمات برنامه نویسی کراس پلتفرم (مالتی پلتفرم) با استفاده از Xamarin.Forms در خدمت شما هستم . فرض این آموزش بر این هست که شما برنامه نویسی به زبان سی شارپ (C# .Net) را از پیش فرا گرفته اید و آشنایی حداقلی با HTML یا XAML دارید . بنا به دلیل اینکه منابع موجود برای پرسش و پاسخ از Xamarin کمتر از منابع موجود برای Native پلتفرم ها میباشد ابتدا حتماً بر روی یکی از زبان های مبتنی بر سی شارپ تسلط داشته باشید . به دلیل شباهت بیشتر ترجیحاً یکی از این زبان ها / سیستم عامل ها را انتخاب کنید : UWP / WPF / Windows Phone Silverlight / Windows Runtime در این آموزش از Visual Studio 2017 و شبیه ساز اندروید مایکروسافت استفاده شده است . در قسمت اول آموزش به سراغ تنظیم امولاتور خواهیم رفت تا شبیه ساز دسترسی به اینترنت داشته باشد و پس آن به آموزش خواهیم پرداخت . امیدوارم که این آموزش مورد توجهتون قرار بگیره . » پیوند های مرتبط « آموزش نصب و راه اندازی زامارین با شبیه ساز مک آموزش تنظیم Visual Studio Emulator for Android جهت دسترسی به اینترنت (پست شماره #2 همین مطلب)
  2. 7 پسند
    سلام وقت بخیر، از اونجا که برای دوست عزیزمون بهروز برای پخش موزیک یا ویدیو در پس زمینه مشکل ایجاد شده، فکر کردم این آموزش رو بذارم برای دوستانی که مشکلی مشابه دارند. نکته: من ویژوال استودیو روی کامپیوترم ندارم پس شاید بعضی از کدهام اشتباه تایپی داشته باشند، پس خودتون با Intellisense ویژوال استودیو اون رو درست کنید. خب پروژه جدیدی از نوع یکپارچه با ورژن SDK نسخه 10.0.14393 به نام WN_BackgroundPlayback ایجاد نمایید. درون این پروژه یک کلاس اضافه کنید و کدهای زیر رو درون اون بنویسید: using Windows.Media.Playback; // in code az sample e MS copy shode namespace WN_BackgroundPlayback { class PlaybackService { // sakhte intanse az class static PlaybackService instance; public static PlaybackService Instance { get { if (instance == null) instance = new PlaybackService(); return instance; } } // har appi mitone ye MediaPlayer dashte bashe ke dar tamame safhat mitone azash estefade kone public MediaPlayer Player { get; private set; } public PlaybackService() { // yadeton bashe hamishe AutoPlay ro false bezarin ta moshkeli baraton pish nayad Player = new MediaPlayer {AutoPlay = false}; } } } سپس این کلاس رو ذخیره کنید و آنرا ببندید. حال فایل Package.appxmanifest را با CodeViewer باز کنید (اگه اشتباه نکنم روش راست کلیک که کنید دومین گزینه باید این فایل رو بصورت xml براتون باز کنه) خب اینجا درون تگِ Capabalities کد زیر را بنویسید: <uap3:Capability Name="backgroundMediaPlayback" /> که کد کلی باید بدین صورت باشد: <Capabilities> <Capability Name="internetClient" /> <uap3:Capability Name="backgroundMediaPlayback" /> </Capabilities> حال صفحه را ذخیره و آنرا ببندید. درون صفحه MainPage یک کنترل MediaPlayerElement قرار دهید (این کنترل از SDK 14393 به بعد قابل استفاده است!!) و یک دکمه که خاصیت Click را برای آن تعریف کرده باشید اضافه کنید: <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Button x:Name="btnPlay" Content="Play" Click="btnPlay_Clicked" /> <MediaPlayerElement x:Name="mediaPlayer" Grid.Row="1" AreTransportControlsEnabled="True" AutoPlay="False" /> </Grid> اکنون صفحه کدنویسی سی شارپ MainPage رو باز کنید و فضای نامی زیر رو به قسمت فضاهای نامی اضافه کنید: using Windows.Media.Playback; بالای کُنستراکتور (public MainPage...) این کد رو بنویسید: public MediaPlayer Player => PlaybackService.Instance.Player; حالا درون کُنستراکتور رویداد loadedـه صفحه را ایجاد نمایید: public MainPage() { InitializeComponent(); Loaded += MainPage_Loaded; } تابع آن: private void MainPage_Loaded(object sender, RoutedEventArgs e) { mediaPlayer.SetMediaPlayer(Player); } اکنون درون تابع رویداد کلیک دکمه کدهای زیر را بنویسید: var item = new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("http://dl.songdl.xyz/sOng/Album/Saman.Jalili-Ch.Haale.Khoobie/Saman.Jalili_06-Raahat.Maro.mp3"))); Player.Source = item; دقیقا یادم نیست برای اینکه از اینا استفاده کنید چه فضاهای نامی ای نیاز هست که اضافه کنید. اگر دیدید که رنگ زیر کلمات قرمز شد موس را چند ثانیه روی آن نگه دارید ویژوال استودیو به شما یک لامپ نشان میدهد که چنانچه روی آن کلیک کنید، یک لیست نشان خواهد داد که کزینه اول را در این لیست انتخاب کنید تا فضای نامی به صفحه اضافه شود. خب تمام شد ! پروژه را اجرا کرده و آنرا امتحان نمایید. نکات اضافی: برای نمایش آهنگ در SMTC نیاز هست که مقدار SMTCـه MediaPlayer را از آن گرفته و آنرا بروز رسانی نمایید.(از اینجا به بعد کپی شده از سورناست!) برای اینکار کافی است که شما در بالای کنستراکتور کد زیر را بنویسید: public SystemMediaTransportControls smtc = null; سپس درون Loaded کد زیر را بعد از کدی که در بالا نوشتید، درون try..catch بنویسید: try { smtc = Player.SystemMediaTransportControls; } catch {} با این کار SMTC پلیر را میگیریم. حال تابع زیر را جهت بروز رسانی کردن SMTC بنویسید public void UpdateSMTC(string singer, string title, string cover) { if (smtc == null) return; smtc.PlaybackStatus = MediaPlaybackStatus.Playing; smtc.DisplayUpdater.Type = MediaPlaybackType.Music; smtc.DisplayUpdater.MusicProperties.AlbumTitle = smtc.DisplayUpdater.MusicProperties.Title = title; smtc.DisplayUpdater.MusicProperties.AlbumArtist = smtc.DisplayUpdater.MusicProperties.Artist = singer; if (!string.IsNullOrEmpty(cover)) smtc.DisplayUpdater.Thumbnail = RandomAccessStreamReference.CreateFromUri(new System.Uri(cover)); smtc.DisplayUpdater.Update(); } حال درون رویداد کلیک بعد از کد پلی کردن، برای بروز رسانی آهنگ کافیست اینگونه عمل نمایید: UpdateSMTC("Saman Jalili", "Rahat Maro", "http://dl.songdl.xyz/sOng/Album/Saman.Jalili-Ch.Haale.Khoobie/Saman.Jalili-Che.Haale.Khoobie.jpg"); به همین سادگی! موفق باشید. منبع هم که همیشه وین نویس هست!
  3. 6 پسند
    برنامه همراه شهر به با قابلیت نصب بر روی ویندوز 10 و ویندوز 8.1 در دسترس عموم قرار خواهد گرفت قابلیت های این نسخه علاوه بر موارد موجود در همراه شهر نسخه موبایل موارد زیر می باشد: سپرده: انتقال وجه دسته‌ای سپرده انتقال وجه سپرده مستمر انتقال وجه دسته‌ای پایا انتقال وجه پایا مستمر گزارش پرداخت مستمر کارت: پرداخت دسته‌ای قبض
  4. 6 پسند
    آموزش برنامه نویسی با Xamain.Forms قسمت سوم : ساخت اولین پروژه (ماشین حساب) / ادامه در بخش قبلی با مقدمات آموزش ساخت پروژه و تصحیح پروژه (در صورت لزوم) آشنا شدیم . در این قسمت به آموزش ساخت اولین پروژه با زمارین میپردازیم . در فایل ویوی اصلی خود ابتدا رابط کاربری برنامه را طراحی میکنیم . طراحی رابط کاربری به شدت شبیه به WPF, UWP میباشد . در پروژه اول با آبجکت های نام آشنای Button و Grid کار میکنیم که همانطور که میدانید Grid فضایی جهت نمایش سایر آبجکت ها درون خود را به شما میدهد . Button یا دکمه ها برای گرفتن ورودی کاربر و انجام دستورات مرتبط استفاده میشود . آبجکت دیگری که در این پروژه به آن جهت نمایش نتیجه نیازمندیم Label میباشد که جهت نمایش متن غیر قابل ویرایش (متون ثابت مانند توضیحات) استفاده میکنیم . ابتدا یک کد XAML بسیار ساده ایجاد مینمائیم . سپس در قسمت XAML.CS کد های مربوط به کلیک دکمه ها را مینویسیم . حال به کمک شبیه ساز ها یا استفاده از دیوایس فیزیکی برنامه را اجرا کنید خواهید دید که برنامه بدون هیچ مشکلی دستگاه یا شبیه ساز اجرا میشود. در پایین اسکرین شاتی از اجرای برنامه در اندروید و ویندوز مشاهده میکنید . همانطور که مشاهده میکنید هر دو برنامه کاملاً مشابه همدیگر البته با قدری تفاوت در جزئیات اجرا گردیدند که این تفاوت های جزئی مربوط به طراحی Native سیستم عامل میباشد و زمارین به صورت پیشفرض از استایل های پیشفرض استفاده میکند تا برنامه بیشتر شبیه به اپ های مرسوم در سیستم عامل شوند . کد های انتشار یافته در بالا نیز نیاز به توضیحات زیادی ندارد به جز اینکه در قسمت XAML از HorizontalTextAlignment و VerticalTextAlignment استفاده شده که بر خلاف اکثر زبان های رایج از ککلمات Start, Center و End استفاده شده . لازم به توضیح است که VerticalTextAlignment معین محل قرار گیری متن در جهت عمودی در صفحه (یا بهتر بگم آبجکت پدر) را تعیین میکند که استارت یعنی در نقطه شروع آبجکت پدر (بالای آن) قرار میگیرد ، یا سنتر در مرکز و End در انتها یا پایین آبجکت . همچنین HorizontalTextAlignment به طور مشابه همین کار را در جهت افق انجام میدهد و استارت آن به معنی سمت چپ آبجکت و End آن به معنای راست آبجکت میباشد . از دیگر موارد قابل ذکر این است که FontSize در زمارین به صورت هم عددی و هم به صورت Large , small , Medium و.... قابل استفاده است و هر دوی آن ها صحیح است ، جهت Bold کردن یا Italic کردن متن نیز میتوانید از FontAttributes استفاده نمائید که البته تنها به بولد و ایتالیک محدود است و گزینه هایی مانند SemiBold را شامل نمیشود ! دانلود سورس کد
  5. 6 پسند
    آموزش برنامه نویسی با Xamain.Forms قسمت سوم : ساخت اولین پروژه (ماشین حساب) از منوی ساخت پروژه جدید ویزوال استدیو به قسمت مشخص شده بروید و یک پروژه جدید با نام دلخواه بسازید . توجه داشته باشید از اسامی بسیار کوتاه استفاده کنید یا آدرس محل ذخیره سازی پروژه را به محلی مانند C:\XamFormProjs تغییر دهید چون در غیر اینصورت در حین بیلد کردن پروزه و ساخت خروجی به خطاهای بسیار زیادی از جمله طولانی شدن آدرس یک فایل بر خواهید خورد که مجبور به تغییر نام پوشه یا انتقال آن به محلی دیگر هستید ! (خلاصه پیشگیری بهتر از درمانه !) سپس با زدن کلید OK پنجره ی دیگری که برای شما باز میشود به صورت پیشفرض روی حالت Xamarin Forms و Blank App تنظیم شده که آن ها را بدون تغییر باقی بگذارید . گزینه code sharing strategy نیز به این اشاره دارد که پروژه مشترک بین هر سه سیستم عامل از نوع کلاس پرتابل باشد یا Shared project که از نوع پیشفرض یعنی Shared Project استفاده مینمائیم و ok را میزنیم تا پروژه ساخته شود . در حین ساخت پروژه ممکن است سوالاتی در ارتباط با Minimum os version و Target platform از شما پرسیده شود که آن ها را به دلخواه تنظیم کنید . یکی از بهترین حالات این است که حداقل ورژن سیستم عامل را روی پایین ترین ورژن موجود در لیست تنظیم کنید و Target را روی جدیدترین ورژن SDK تنظیم کنید . پس از ساخته شدن کامل پروژه روی پروژه اصلی (Solution) که در آن 4 پروژه دیگر وجود دارد راست کلیک کنید و Manage NuGet package for solution را بزنید . حال در بخش Updates تیک گزینه Select all packages را بزنید و سپس کلید Update را بزنید تا همه Nuget ها به یک باره آپدیت شوند .سپس احتمالاً ویژوال استدیو از شما میخواهد یک بار برنامه را ریست کنید این کار را انجام دهید . در اجرای مجدد پس از آپدیت شدن همه نوگت ها احتمالاً تعدادی نوگت جدید اضافه خواهد شد مانند Xamarin.Build.Download که آن ها را نیز آپدیت نمائید و در صورت نیاز نیز ویژوال استدیو را مجدداً ریست کنید تا احتمال خطا در حین انجام کار کمتر شود . حال یک بار سولوشن را Rebuild کنید . (Debug , Any CPU, Android) پس از پایان یافتن ریبیلد در پروژه Shared فایل MainPage.XAML را اجرا نمائید و سعی کنید داخل تگ ContentPage یک تگ مانند Label بسازید . اگر ساجسشن های ویژوال استدیو به درستی نمایش داده شد و توانستید تگ Label را پیدا کنید که مشکلی نیست اما در غیر اینصورت باید از ویژوال استدیو و زمارین تشکر کرد ! در این حالت ابتدا یک پوشه به نام View در پروژه Shared ایجاد نمائید . سپس روی پوشه راست کلیک کنید Add -> New item را بزنید . حال یک Content Page با نام دلخواه ایجاد کنید و در پوشه View اضافه نمائید . حال فایل جدید باید بدون مشکل قابلیت ساجست را داشته باشد ! فایل MainPage قبلی که در روت پروژه قرار دارد را حذف کنید و سپس فایل App.XAML.Cs را باز کنید و در کانستراکتور App پس از InitializeComponent() به فایلی که ساختید رفرنس دهید . حال پروژه شما به یک پروژه صحیح بدون مشکل تبدیل شد . حال پس از تصحیح پروژه در ادامه اولین پروژه را خواهیم ساخت . این آموزش ادامه دارد ...
  6. 6 پسند
    آموزش برنامه نویسی با Xamain.Forms قسمت دوم: معرفی انواع صفحات در زمارین فرم در این قسمت قصد داریم با انواع صفحات موجود در زمارین فرم آشنا شویم. تعدادی از انواع پر استفاده تر این صفحات: Content Page Master Detail Page Navigation Page Tabbed Page نوع اول یعنی Content Page یک صفحه خالی و بسیار ساده است که میتوانید از آن برای نمایش محتوا به کاربر ستفاده کنید. این نوع صفحه در اکثر زبان های برنامه نویسی و قالب ها به عنوان Blank Page نیز شناخته میشود. نوع دوم یعنی Master Details Page یکی از انواع پر کاربرد صفحات است که این نوع صفحه شامل منوی همبرگری به صورت پیشفرض بوده و همچنین عنوان صفحه میباشد. این نوع صفحه به صورت خودکار Navigation های کاربر را مدیریت میکند و همانطور که گفته شد شامل منوی همبرگری قابل سوایپ در اندروید میباشد. Navigation خودکار به ین معنیست که در صورت تغییر صفحه برنامه خود Xamarin به صورت خودکار کلید برگشت را مدیریت خواهد کرد. نوع سوم یعنی Navigation Page نیز دقیقاً مانند Master Detail Page میباشد با این تفاوت که دارای منوی همبرگری نمیباشد. نوع چهارم صفحات یعنی Tabbed Page صفحه ای میسازد که به صورت تب بوده و مشابه Pivot در UWP میباشد. در قسمت بعدی آموزش با آموزش ساخت یک برنامه ماشین حساب بسیار ساده در خدمت شما خواهیم بود. در قسمت دوم آموزش از Content Page استفاده خواهیم کرد که ساده ترین نوع صفحه است. در قسمت های بعدی با انواع دیگر صفحات بیشتر آشنا خواهیم شد.
  7. 6 پسند
    قسمت اول : آموزش تنظیم Visual Studio Emulator for Android جهت دسترسی به اینترنت ابتدا در استارت منو (یا کرتانا) عبارت Hyper-V Manager را جستجو کنید و برنامه را اجرا کنید . در محیط Hyper-V Manager به قسمت Virtual Switch Manager بروید . در پنجره ای که باز میشود در قسمت سمت راست گزینه External را انتخاب کنید و سپس روی Create Virtual Switch کلیک کنید . سپس در لیست Virtual Switches یک سوئیچ جدید اضافه شده که وارد آن شوید . حال پنجره را Apply و ok کنید تا بسته شود . سپس در صفحه اصلی Hyper-v Manager در قسمت Virtual Machines ماشین مجازی مد نظر خود را انتخاب روی آن راست کلیک نمائید و سپس به قسمت Settings آن بروید . در صورتی که ماشین مجازی مورد نظر را یافت نمیکنید توجه داشته باشید که حتماً یک بار باید ماشین مجازی شما اجرا شده باشد ، در غیر اینصورت در این لیست ظاهر نخواهد شد . در پنجره باز شده در قسمت add hardware گزینه Network Adapter را انتخاب کنید و آنرا Add کنید . حال در لیست سخت افزار ها Network Adapter را انتخاب نمائید و در تنظیمات شبکه Virtual Switch ی که در مراحل قبل ساختید را انتخاب کنید . در صورتیکه چندین virtual switch ایجاد نمودید اینجا نیز به تعداد virtual switch ها Network Adapter بسازید و در هر کدام یکی از سوئیچ ها را انتخاب کنید . حالا پنجره را اوکی کنید و کار تمام است . حالا پس از اجرای امولاتور باید بتوانید از اینترنت استفاده نمایئد .
  8. 5 پسند
    سلام، بصورت پیشفرض Encoding 1252 در باندل نهایی افزوده نمیشه. برای اینکار Propertiesـه پروژه رو باز کنید و به تب Android Options بروید. در این صفحه از تب Linker رو انتخاب کنید و گزینه Linking رو روی Sdk Assemblies Only رو انتخاب کنید. در قسمت Additional supported encodings هم گزینه west رو تیک بزنید. همین! موفق باشید.
  9. 5 پسند
    با سلام، یه سری نکات هست که بطور تجربی بدست آوردم و میتونه تو جلوگیری از خطا ها و دولوپ سریع تر کمکتون کنه. >> بعد از راه اندازی محیط برنامه و نصب sdk و ndk و jdk که مورد نیازه برای اندروید در زامارین سعی کنید ارتباط با اینترنت را همراه با وی پی ان داشته باشید، چون ممکنه سیستم به یک سری فایل نیاز پیدا کنه که باید از گوگل دانلود کنه که متاسفانه ایران تحریم هست ولی درصورت نداشتن وی پی ان می شود این فایل هارو بصورت دستی اضافه کرد. دقت داشته باشید که ورژن نوگت ها یا کامپوننت های Support گوگل باید مطابق با ورژنی که پروژه را برای آن اندروید کامپایل میگیرد باشد، نه جدیدترین آن. وقتی ورژن هدف کامپایل پروژه رو مثلا 6 در نظر میگیرید اصلا نگران اجرا شدنش روی ورژن های پایین تر در قدم نخست نباشید (4.1) و ابزار ها و دسترسی های مخصوص برای این موضوع مهم است. هیچ وقت مانند ویندوز یونیورسال تنظیمات خروجی برنامه رو بدون اطلاعات کامل تغییر ندهید، ممکن است باعث مشکل در آینده شود. نسخه دیباگ در حالت پیشفرض روی دیوایس واقعی کار نمیکند و نسخه ریلیسیس هم بر عکس. طبق عادت مانند برنامه نویسی ویندوز برای سبک شدن یا برطرف شدن ارور ها فولدر object و bin را پاک نکنید.
  10. 4 پسند
    آموزش کار با Navigationbar در Xamarin.Forms همانطور که در آموزش قدم به قدم برنامه نویسی Xamarin.Forms نیز اشاره کردم یکی از انواع صفحات موجود در زمارین فرم NavigationPage میباشد . به صورت پیشفرض این صفحه در بالای هر صفحه یک کادر حاوی عنوان صفحه و کلید بازگشت به صفحه قبل نشان میدهد . در این آموزش خواهیم آموخت چطور این صفات را تغییر دهیم . 1 - پنهان کردن کامل نوار بالا در یک صفحه : در صفحه مورد نظر خود کد زیر را جهت عدم نمایش NavigationBar وارد کنید : NavigationPage.SetHasNavigationBar(this, false); و جهت نمایش مجدد آن از کد زیر استفاده کنید : NavigationPage.SetHasNavigationBar(this, true); 2 - جهت عدم نمایش کلید بازگشت در NavigationPage : NavigationPage.SetHasBackButton(this, false); جهت نمایش مجدد : NavigationPage.SetHasBackButton(this, true); نکته : اگر صفحه ای صفحه نخست باشد true کردن نمایش کلید بازگشت باعث نمایش این کلید نخواهد شد . نکته : اگر صفحه ای کلید بازگشت از آن محو شود باعث از کار افتادن عملکرد کلید بازگشت دستگاه های اندروید و ویندوز فون نخواهد شد .
  11. 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(); }
  12. 4 پسند
    آموزش برنامه نویسی با Xamain.Forms قسمت چهارم : کد نویسی اختصاصی هر سیستم عامل ! با توجه به امکانات بسیار عالی زمارین فرم باز هم در بسیاری از قسمت ها نیاز داریم که از امکانات اختصاصی پلتفرم ها استفاده کنیم یکی از بارز ترین این استفاده ها نوشتن کد های مربوط به پخش مدیا در پس زمینه میباشد . باید بگم که این قسمت از آموزش یکی از مهم ترین و اصلی ترین قسمت های آموزش میباشد پس به دقت مراحل را انجام دهید . به عنوان یک نمونه خیلی ساده در این آموزش میخواهیم یک پیام خوش آمد ساده به کاربر نشان دهیم اما بسته به اینکه برنامه در چه پلتفرمی اجرا میشود پیغام متفاوتی نمایش داده شود . برای انجام این کار ابتدا نیاز به ساخت یک Interface داریم . در پروژه مشترک زمارین ابتدا یک پوشه به نام دلخواه ایجاد نمائید به عنوان مثال Services یا Classes در پوشه ایجاد شده یک کلاس به نام دلخواه مانند WelcomeMsg بسازید . کلاسی به صورت زیر برای شما ایجاد میشود . class WelcomeMsg { } حال کلاس فوق را به صورت تغییر دهید تا تبدیل به interface شود. public interface IWelcomeMsg { } به دلیل اینکه قواعد کد نویسی سی شارپ را نیز رعایت کرده باشیم ابتدای نام یک I (آی) بزرگ اضافه میکنیم که بیانگر اینترفیس باشد . حال درون آن به تعریف توابعی که در این اینترفیس موجود میباشد میپردازیم . در اینجا تنها کافیست که به امضای تابع و متغیر های پابلیک تعریف شده اشاره کنید و نیازی به نوشتن هیچ کدی نیست . public interface IWelcomeMsg { string GetWelcomeMessage(); } خب به همین سادگی اینترفیس ما ساخته شده و آماده است ! حال باید در تمامی پروژه های مرتبط به تک تک سیستم عامل ها یک پوشه با نام پوشه ای که در پروژه ساختید ایجاد نمائید و کلاسی نیز با همان نام ایجاد نمائید . (هرچند اجباری در این نام گذاری ها نیست اما به جهت جلوگیری از پیچیده شدن کار بهتر است از همین شیوه استفاده نمائید) به عنوان مثال در پروژه UWP در پوشه Services یک کلاس با نام WelcomeMsg ایجاد مینمائیم . پس از ساخته شدن فایل لازم هست که کلاس خودمون رو به اینترفیس ساخته شده متصل نمائیم و برای این کار از خاصیت ارث بری سی شارپ استفاده میکنیم class WelcomeMsg : IWelcomeMsg { } قطعا خواهید دید که از IWelcomeMsg ارور گرفته میشود . اشاره گر موس را روی IWelcomeMsg قرار دهید و روی علامت چراغ زرد رنگ ظاهر شده کلیک کنید و سپس Implement Interface را انتخاب کنید . حال به صورت خودکار توابع تعریف شده در اینترفیس اینجا تعریف خواهند شد . class WelcomeMsg : IWelcomeMsg { public string GetWelcomeMessage() { throw new NotImplementedException(); } } خط throw new NotImplementedException(); به این منظور به صورت خودکار ایجاد میشود تا در صورت فراخوانی تابع Debugger به خطا برخورد کند و به شما اخطار دهد که این تابع کد نویسی نشده ! در اینجا به این خط نیازی نداریم و آنرا پاک میکنیم و به جای آن پیام خود را مینویسیم مانند : return "Welcome to our UWP Xamarin App"; حال در خط اول کلاس پیش از namespace و بعد از using ها این خط را اضافه میکنیم : [assembly: Xamarin.Forms.Dependency(typeof(XFCalc.UWP.Services.WelcomeMsg))] با توجه به کد بالا متوجه خواهید شد که Attribute موسوم به Dependency در زمارین فرم را به کلاس پروژه خود متصل نمودیم . به این ترتیب بین اینترفیس در پروژه مشترک و کلاس ما در هر سیستم عامل ارتباط برقرار میشود . حال به صورت مشابه همین کلاس را در اندروید نیز خواهیم ساخت به صورت زیر : [assembly: Xamarin.Forms.Dependency(typeof(XFCalc.Droid.Services.WelcomeMsg))] namespace XFCalc.Droid.Services { class WelcomeMsg : IWelcomeMsg { public string GetWelcomeMessage() { return "Welcome to our Android Xamarin App"; } } } حال در زمل صفحه اصلی برنامه در پروژه مشترک یک Label جهت نمایش پیام به کاربر ایجاد میکنیم <ContentPage.Content> <Grid> <Label VerticalOptions="Center" HorizontalOptions="Center" x:Name="LabelMsg"/> </Grid> </ContentPage.Content> حال در قسمت کد سی شارپ همین صفحه از طریق کد زیر پیام خود را مرتبط با سیستم عاملی که برنامه در آن در حال اجراست دریافت میکنیم و به کاربر نمایش میدهیم . LabelMsg.Text = DependencyService.Get<IWelcomeMsg>().GetWelcomeMessage(); در آموزش های بعدی با کاربرد های بسیار گسترده تری از این قابلیت آشنا خواهید شد و تعدادی کلاس هایی که پیش از این نوشته ام رو به اشتراک میگذارم .
  13. 3 پسند
    سلام؛ برد Uno یکی از محبوب ترین بردهایی است که تولید شده و البته همانطور که از نامش پیداست (UNO در ایتالیایی یعنی عدد یک) آغازگر انقلاب آردوئینو بوده است. بردی ارزان (حدود 20 هزار تومان) که بر پایه mega328 توسعه یافته و بر همین اساس امکانات خوبی را برای ما فراهم می کند: 14 پین برای ورود و خروج اطلاعات که 6 تا از آنها به عنوان pwm نیز قابل استفاده هستند یک مزیت برای هر کاربری است که تعداد زیادی ورودی و خروجی در مدار خود دارد. وجود پورت USB از نوع مینی علاوه بر آسان کردن پروگرام این برد، تغذیه آن را هم از طریق طیف وسیعی از منبع تغذیه های موجود در بازار (شارژر موبایل!) امکان پذیر کرده است. البته جک مادگی ضخیم شارژ همچنان بر روی این برد قابل مشاهده است، تا در صورت نیاز به درگاه USB بتوانید همچنان برد را تغذیه کنید. پین هدرISCP و کلید ریسیت هم از سایر چیزهایی است که در این برد وجود دارد. برای راه اندازی این برد به صورت پایدار به اختلاف پتانسیل مابین 6 تا 20 ولت نیاز دارید، البته اگر ولتاژ را به بیش از 12 ولت برسانید، به علت افزایش دمای چیپ بهتر است از یک سینک یا خنک کننده دیگر استفاده کنید. بهتر است بگوییم بهترین بازه عملیاتی این برد در ولتاژ 7 تا 12 ولت قرار دارد. حافظه این برد 32 کیلوبایت هست که کاملا کافی به نظر می رسد! 2 کیلوبایت SRAM و 1 کیلو بایت EEPROM هم در اختیار شماست (البته من نمی دونم دقیقا کاربردشون چیه!). در آخر هم خوب است بدانید که با دو پین RX و TX می توانید از ماژول های رادیویی مثل بلوتوث هم استفاده کنید!
  14. 3 پسند
    سلام؛ احتمالا برای شما هم این سوال پیش آمده باشد که چه زمانی باید از بردهای رسپبری پای و چه زمانی از بردهای (یا ماژول‌های) آردوئینو استفاده کرد. با این که این یک قانون نیست اما در کلیت می‌تواند راهگشا باشد. هر گاه نیاز بر این باشد که شما اطلاعاتی را از محیط دریافت کنید یا کاری بر روی سیستم انجام دهید، بهتر است از بردهای آردوئینو و ماژول‌های آن استفاده کنید. و هر گاه نیاز به پردازش این اطلاعات دارید یا می‌خواهید دستورات پیچیده‌ای برای اعمال به بردهای آردوئینو بدهید، باید از رسپبری پای یا سایر بردهای دارای سیستم عامل استفاده کنید. البته واضح هست که برد رسپبری پای خود می‌تواند به وسیله سنسور، برخی از اطلاعات را دریافت کند، اما ماژول‌های موجود برای بردهای آردوئینو بسیار گسترده تر و ارزانتر هستند. همچنین باید به این نکته هم توجه کرد که گوشی موبایل هم می‌تواند تبدیل به واحد پردازشی سیستم ما شود. پس با رسپبری پای تمام اطلاعات را از آردوئینو دریافت و پردازش کنید.
  15. 3 پسند
    آموزش برنامه نویسی با Xamain.Forms قسمت ششم : استایل دهی به آبجکت ها در هر پلتفرم توی این قسمت از آموزش میپردازیم به بحث Custom Renderer قبل از هر چیزی باید بدونیم CustomRenderer چی هست و چه زمان باید بریم سراغش همینطور که در متن بالا هم قابل مشاهده هست برای هر کنترل (یا به عبارتی آبجکت) توی زمارین یک Renderer هم براش وجود داره که بهتره از همون دیفالتش استفاده کنیم اما برای جاهایی که امکان تغییر یک مشخصه از آبجکت برای ما وجود نداره باید خودمون دست به کار بشیم و تغییرات رو خودمون اعمال کنیم . نمونه هایی از جاهایی که نیاز هست از Custom Renderer استفاده کنیم : 1 - گرد کردن گوشه های کادر های ورودی کاربر (Entry) 2 - انتخاب یک پس زمینه گرادیانت برای صفحه و.... برای مثال عملی با همین گرد کردن کادر دور Entry شروع میکنیم . توی پروزه مشترک زمارین یک پوشه به اسم StyledObjects که آبجکت هایی که بهشون استایل میدیم رو اونجا ذخیره میکنیم . البته اسم پوشه کاملاً دلخواه هستش. یک کلاس داخل پوشه به اسم CSRoundedEntry بسازید که مخفف Custom Styled Rounded Entry میباشد . مشخصه هایی که برای آبجکت مد نظرتون در نظر دارید (علاوه بر مشخصه های پیشفرض آبجکت اصلی) داخل این کلاس تعریف کنید . دقت کنید این کلاس باید از آبجکت اصلی ارث بری شده باشد . به عنوان مثال : namespace GettingStarted.StyledObjects { class CSRoundedEntry : Entry { public int CornerRadious { get; set; } } } همانطور که در کد بالا قابل مشاهده است با استفاده از Entry : کلاس من از خواص Entry ارث بری شده و وارث خواص این کلاس است علاوه بر اینکه یک مشخصه به نام Corner Radious جهت میزان زاویه خمیدگی در نظر گرفتم . حالا باید دقیقاً مثل بحث قبلی که بحث DependencyServices بود باید در هر پروژه یک کلاس برای این آبجکت ایجاد نمائیم . در پروژه اندروید یک کلاس مانند زیر ایجاد میکنیم [assembly: ExportRenderer(typeof(GettingStarted.StyledObjects.CSRoundedEntry), typeof(GettingStarted.Droid.StyledObjects.CSRoundedEntry))] namespace GettingStarted.Droid.StyledObjects { class CSRoundedEntry : EntryRenderer { } } خب همونطور که در بالا هم مشاهده میشه کاستوم رندرر هم خیلی شبیه به Dependency Service ها هست با این تفاوت که چون از اینترفیس ارث بری نشده در ExportRenderer هم کلاس اصلی در پروژه ی مشترک رو ذکر میکنیم هم کلاسی که همینجا مینویسیم و به این طریق این دو کلاس رو به هم ربط میدیم . حالا در کلاس یک تابع وجود داره که باید اون رو Override کنیم به نام OnElementChanged . داخل کلاس این تابع رو اضافه میکنیم : protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { base.OnElementChanged(e); if (Control != null) { this.Control.Background = ContextCompat.GetDrawable(Context,Resource.Drawable.RoundedCornerEntry); } } با استفاده از Control شما به پراپرتی ها (مشخصات) آبجکت دسترسی دارید . این قسمت کار واقعاً نیازمند تسلط به کد نویسی هر سیستم عامل میباشد و امکان اینکه یک نسخه مشترک برای همه سیستم عامل ها بپیچیم وجود نداره . برای اینکه راحت تر بتونیم به آبجکت ها استایل بدیم و اینکه بشه روش نسبتاً مشترکی برای همه سیستم عامل ها گفت من در نسخه اندروید و UWP با استفاده از زبان کد نویسی رابط کاربری خود سیستم عامل ها یک فایل استایل ساختم و اون رو در کد لود میکنم . همونطور که در کد بالا هم مشاهده میکنید Rounded Corner Entry رو از ریسورس های برنامه لود میکنم . پس در پوشه Resources و پوشه Drawable یک فایل xml به نام RoundedCornerEntry.xml ایجاد میکنم که از طریق کد سی شارپ هم این فایل رو فراخونی کردم . اگر Build Action این فایل چیزی جز Android Resource بود بیلد اکشن رو تغییر بدید . داخل فایل استایل مورد نظر خودم رو مینویسم که به شکل زیر هست : <?xml version="1.0" encoding="UTF-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" > <shape android:shape="rectangle"> <gradient android:startColor="@color/entry_background" android:endColor="@color/entry_background" android:angle="270" /> <stroke android:width="1dp" android:color="@color/entry_border" /> <corners android:radius="6dp" /> </shape> </item> <item> <shape android:shape="rectangle"> <gradient android:startColor="@color/entry_background" android:endColor="@color/entry_background" android:angle="270" /> <stroke android:width="1dp" android:color="#c6c6c6" /> <corners android:radius="6dp" /> </shape> </item> </selector> خب اینکه چطور این استایل رو نوشتم هم خیلی ساده اس فقط یک سرچ توی اینترنت زدم ! همین . همینطور اگه تو ریسورس بالا دقت کنید زاویه لبه های کادر رو 6dp در نظر گرفتم و کلا به پراپرتی که به عنوان نمونه اضافه کرده بودم کار نداشتم ! حالا میریم به سراغ ios : توی ای او اس هم دقیقاً مثل همون قضیه Dependency Service و مثل کاری که برای اندروید انجام دادیم مجددا یک کلاس میسازیم و تابع رو override میکنیم : [assembly: ExportRenderer(typeof(GettingStarted.StyledObjects.CSRoundedEntry), typeof(GettingStarted.iOS.StyledObjects.CSRoundedEntry))] namespace GettingStarted.iOS.StyledObjects { class CSRoundedEntry : EntryRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { base.OnElementChanged(e); if (Control != null) { Control.Layer.CornerRadius = 6; Control.Layer.BorderWidth = new nfloat(2); Control.Layer.BackgroundColor = UIColor.FromRGBA(255, 255, 255, 204).CGColor; Control.TintColor = UIColor.FromRGBA(255, 255, 255, 178); } } } } که همونطور که مشخص هست اینجا هم کاری به کار مشخصه ای که تعریف کردیم نداشتم و باز هم زاویه رو 6 در نظر گرفتم ! حتی نمیدونم چرا اون پراپرتی رو الکی در نظر گرفتم همونطور که توی کد بالا مشخص هست با استفاده از Control.Layer به مشخصات آبجکت دسترسی داریم و میتونیم تغییرات رو اعمال کنیم حالا به سراغ UWP میریم . برای تغییر دادن آبجکت ها توی UWP یک روش بسیار ساده وجود داره . وارد msdn.com بشید سرچ کنید ObjectName Default Style in UWP به عنوان مثال دیفالت استایل مربوط به تکست باکس در این لینک قابل مشاهده هست . دیفالت استایل رو کافیه کپی کنیم و توی فایل app.XAML آنرا کپی کنید . البته ابتدا باید در این فایل چند خط کد اضافه کنید <Application.Resources> <ResourceDictionary> </ResourceDictionary> </Application.Resources> حال باید استایل را در داخل ResourceDictionary کپی کنید و تغییرات مورد نظرتون رو در استایل پیشفرض ایجاد کنید . برای جلوگیری از شلوغ شدن فایل هم پیشنهاد میکنم توی پروژه UWP یک پوشه به اسم Styles ایجاد کنید و یک فایل ResourceDictionary در این پوشه ایجاد کنید و داخل فایل app.XAML این فایل را به صورت زیر لود کنید . <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/Styles/Dictionary1.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> برای مثال من استایل پیشفرض رو به شکل زیر تغییر دادم و در فایل Dictionary1 کپی کردم : <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <!-- Default style for Windows.UI.Xaml.Controls.TextBox --> <Style TargetType="TextBox" x:Key="StyleRoundedTextBox"> <Setter Property="MinWidth" Value="{ThemeResource TextControlThemeMinWidth}" /> <Setter Property="MinHeight" Value="{ThemeResource TextControlThemeMinHeight}" /> <Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}" /> <Setter Property="Background" Value="{ThemeResource SystemControlBackgroundAltHighBrush}" /> <Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundChromeDisabledLowBrush}" /> <Setter Property="SelectionHighlightColor" Value="{ThemeResource SystemControlHighlightAccentBrush}" /> <Setter Property="BorderThickness" Value="{ThemeResource TextControlBorderThemeThickness}" /> <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" /> <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}" /> <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Auto" /> <Setter Property="ScrollViewer.VerticalScrollMode" Value="Auto" /> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Hidden" /> <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Hidden" /> <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="False" /> <Setter Property="Padding" Value="{ThemeResource TextControlThemePadding}"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TextBox"> <Grid> <Grid.Resources> <Style x:Name="DeleteButtonStyle" TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Grid x:Name="ButtonLayoutGrid" BorderBrush="{ThemeResource TextBoxButtonBorderThemeBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{ThemeResource TextBoxButtonBackgroundThemeBrush}"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal" /> <VisualState x:Name="PointerOver"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GlyphElement" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAccentBrush}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="Pressed"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonLayoutGrid" Storyboard.TargetProperty="Background"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAccentBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GlyphElement" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAltChromeWhiteBrush}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="Disabled"> <Storyboard> <DoubleAnimation Storyboard.TargetName="ButtonLayoutGrid" Storyboard.TargetProperty="Opacity" To="0" Duration="0" /> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <TextBlock x:Name="GlyphElement" Foreground="{ThemeResource SystemControlForegroundChromeBlackMediumBrush}" VerticalAlignment="Center" HorizontalAlignment="Center" FontStyle="Normal" FontSize="12" Text="&#xE10A;" FontFamily="{ThemeResource SymbolThemeFontFamily}" AutomationProperties.AccessibilityView="Raw"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </Grid.Resources> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Disabled"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HeaderContentPresenter" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseMediumLowBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" Storyboard.TargetProperty="Background"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledTransparentBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement" Storyboard.TargetProperty="Background"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement" Storyboard.TargetProperty="BorderBrush"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentElement" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledChromeDisabledLowBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PlaceholderTextContentPresenter" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledChromeDisabledLowBrush}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="Normal" /> <VisualState x:Name="PointerOver"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement" Storyboard.TargetProperty="BorderBrush"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightChromeAltLowBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" Storyboard.TargetProperty="Opacity"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource TextControlBackgroundHoverOpacity}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="Focused"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PlaceholderTextContentPresenter" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlPageTextChromeBlackMediumLowBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" Storyboard.TargetProperty="Background"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundChromeWhiteBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" Storyboard.TargetProperty="Opacity"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource TextControlBackgroundFocusedOpacity}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement" Storyboard.TargetProperty="BorderBrush"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAccentBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentElement" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlForegroundChromeBlackHighBrush}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentElement" Storyboard.TargetProperty="RequestedTheme"> <DiscreteObjectKeyFrame KeyTime="0" Value="Light" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup x:Name="ButtonStates"> <VisualState x:Name="ButtonVisible"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DeleteButton" Storyboard.TargetProperty="Visibility"> <DiscreteObjectKeyFrame KeyTime="0"> <DiscreteObjectKeyFrame.Value> <Visibility>Visible</Visibility> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="ButtonCollapsed" /> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Border x:Name="BackgroundElement" Grid.Row="1" Background="{TemplateBinding Background}" Margin="{TemplateBinding BorderThickness}" Opacity="{ThemeResource TextControlBackgroundRestOpacity}" Grid.ColumnSpan="2" Grid.RowSpan="1"/> <Border x:Name="BorderElement" CornerRadius="6" Grid.Row="1" BorderBrush="#ccffffff" Background="#b2ffffff" BorderThickness="2" Grid.ColumnSpan="2" Grid.RowSpan="1"/> <ContentPresenter x:Name="HeaderContentPresenter" x:DeferLoadStrategy="Lazy" Visibility="Collapsed" Grid.Row="0" Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}" Margin="0,0,0,8" Grid.ColumnSpan="2" Content="{TemplateBinding Header}" ContentTemplate="{TemplateBinding HeaderTemplate}" FontWeight="Normal" /> <ScrollViewer x:Name="ContentElement" Grid.Row="1" HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}" Margin="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" IsTabStop="False" AutomationProperties.AccessibilityView="Raw" ZoomMode="Disabled" /> <ContentControl x:Name="PlaceholderTextContentPresenter" Grid.Row="1" Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}" Margin="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" IsTabStop="False" Grid.ColumnSpan="2" Content="{TemplateBinding PlaceholderText}" IsHitTestVisible="False"/> <Button x:Name="DeleteButton" Grid.Row="1" Style="{StaticResource DeleteButtonStyle}" BorderThickness="{TemplateBinding BorderThickness}" Margin="{ThemeResource HelperButtonThemePadding}" IsTabStop="False" Grid.Column="1" Visibility="Collapsed" FontSize="{TemplateBinding FontSize}" MinWidth="34" VerticalAlignment="Stretch"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary> حالا دوباره مثل نسخه اندروید و آی او اس کلاس مینویسیم و تابع override میکنیم به این شکل : [assembly: ExportRenderer(typeof(GettingStarted.StyledObjects.CSRoundedEntry), typeof(GettingStarted.UWP.StyledObjects.CSRoundedEntry))] namespace GettingStarted.UWP.StyledObjects { class CSRoundedEntry : EntryRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { base.OnElementChanged(e); Control.Style = (Windows.UI.Xaml.Style)GettingStarted.UWP.App.Current.Resources["StyleRoundedTextBox"]; } } } یک نکته خیلی مهم که توی این کد بالا هست اینه که حتماً حتماً حتماً این namespace ها توی کد UWP باشه . چون هم کلمه Style هم App به صورت مشترک در خود UWP و هم در Xamarin.Forms استفاده شده و اگر حواستون نباشه به راحتی این دو تا کلاس با هم اشتباه میشن و به ارور های زمان کامپایل و ران تایم بر میخورید که حتی خیلی وقت ها هم ممکنه اصلا متوجه نشید کجا رو اشتباه کردید که به این خطا ها برخورد کردید . خب باز هم توی کد های بالا میبینید که باز هم اون Corner Radious که تعریف کردم رو ازش استفاده نکردم اما اگر شما نیاز دارید که حتما مقدار اون پراپرتی رو دسترسی داشته باشید بهش به این صورت میتونید بهش دسترسی داشته باشید : protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { base.OnElementChanged(e); if (Control != null) { var element = (GettingStarted.StyledObjects.CSRoundedEntry)e.NewElement; var rad = element.CornerRadious; } } حالا که آبجکت ما برای هر سه سیستم عامل حاضر شده توی کد های XAML صفحه مورد نظرمون کافیه که ابتدا نیم اسپیس کلاس خودمون رو به پروژه بشناسونیم : xmlns:local="clr-namespace:GettingStarted.StyledObjects" و بعد توی کد های زمل هم مثل خط زیر میشه از آبجکت خودمون استفاده کنیم و پراپرتی های مورد نظرمون رو هم به دلخواه مقدار دهی کنیم : <local:CSRoundedEntry Placeholder="passwod" FontSize="20" HeightRequest="50" IsPassword="True" CornerRadious="6"/>
  16. 2 پسند
    من مشکلات سورس رو در قالب یک پروژه جدید رفع کردم . خود سورس به اندازه کافی مستند سازی کرده با این وجود شاید کد ها خیلی پیچیده به نظر برسن... توضیحات استفاده: ابتدا باید دو دستگاه که این برنامه بر روی اونا نصبه بلوتوثشون روشن باشه و قبلا با هم pair هم شده باشند. حالا برنامه رو در دو دستگاه اجرا کنید در یکی به صفحه کلاینت و دیگری به صفحه سرور رجوع کنید ، در صفحه سرور بر روی start listening کلیک کنید و در دستگاه دیگه روی start و سپس از لیست دستگاه های یافت شده ، دستگاه دیگر رو انتخاب کرده و بر روی connect to selected device کلیک کنید ، حالا که دو دستگاه به هم متصل هستند میتونید پیام به هم ارسال کنید. توجه : ظاهرا تنها کارکتر های ASCII پشتیبانی میشه بنابراین ارسال کارکتر های فارسی باعث کرش برنامه میشه... BluetoothChat.rar
  17. 2 پسند
    جواب کل سوالاتت تو سه خط کد : MPE.Source = Windows.Media.Core.MediaSource.CreateFromUri(new Uri("http://....", UriKind.RelativeOrAbsolute)); MPE.MediaPlayer.Play(); MPE.MediaPlayer.Pause(); //MPE = MediaPlayerElement
  18. 2 پسند
    ایونت های کیبورد فقط زمانی فایر میشن که کنترل مورد نظر فوکوس شده باشه ، یه گرید به طور عادی نمیتونه فوکوس بپذیره مگر اینکه دارای بچه ای با امکان فوکوس مثل یه ListBox باشه ، شما میتونید یه کنترل مانند یه لیست باکس خالی درون گرید قرار بدید و دوباره تست کنید.
  19. 2 پسند
    هم از لحاظ امنیتی هم از لحاظ مواجه شدن با مشکلات اصلا کار درستی نیست که به صورت مستقیم با دیتابیس کار کنید . شما باید یک WebApi بنویسید که از طریق اون به سرور درخواست بدید سرور از روی دیتابیس اطلاعات مورد نظر رو برای شما به صورت JSON یا XML ارسال کنه . در گذشته XML خیلی کاربرد داشت ولی الان تقریباً همه JSON استفاده میکنن چون کوتاه تر هست و حجم اطلاعات ارسالی و دریافتی کمتره . پایگاه داده سمت سرور هم قاعدتاً Oracle یا SQL Server (ترجیحاً ورژن 2016) باشه نتیجه بهتری میگیرید .
  20. 2 پسند
    آموزش برنامه نویسی با Xamain.Forms قسمت هفتم: کار با لیست ویو لیست ویو Incremental Loading در این قسمت آموزش قصد دارم به شما نشون بدم که چطور میتونید یک لیست بسازید که به صورت خودکار آیتم های بیشتری لود کنه . این نوع لیست ویو چه کاربردی داره و چه زمانی از اون استفاده میکنیم ؟ این نوع لیست برای زمان هایی کاربرد داره که لیست ما احتمالا طولانی شدن اون زیاد هست یا حجم داده ها به هر نحوی زیاد هست یا اصلا اطلاعاتی که از سرور دریافت میکنیم به صورت صفحه به صفحه است و در هر صفحه به عنوان مثال 10 یا 20 آیتم جدید به ما برگردونده میشه . در اینجا من یک برنامه ساده میسازم که فقط یک متن ساده همراه با عکس دریافت میکند و به کاربر نشان میدهد . ابتدا یک لیست ویو میسازیم . برای سادگی کار از ItemTemplate برای استایل دادن به آیتم های درون لیست استفاده میکنیم . <ListView x:Name="Lst" > <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid BackgroundColor="LightCyan"> <Grid.ColumnDefinitions> <ColumnDefinition Width="87"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid Grid.Column="0"> <Image Grid.Column="0" Margin="0,7.5" HeightRequest="70" WidthRequest="70" Source="{Binding Img}" Aspect="AspectFit" VerticalOptions="Fill" HorizontalOptions="Fill" /> </Grid> <StackLayout Grid.Column="1" VerticalOptions="Center"> <Label Text="{Binding Text1}" FontAttributes="Bold" /> <Label Text="{Binding Text2}" TextColor="#FF646464" FontAttributes="Italic" /> <Label Text="{Binding Text3}" TextColor="#FF646464" Margin="0,0,10,0" FontAttributes="Bold"/> </StackLayout> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> همونطور که مشاهده میکنید لیست ویو یک لیست کاملاً ساده هست و همونطوری ساخته شده که توی برنامه نویسی UWP و WPF هم لیست ویو میسازیم با این تفاوت که داخل DataTemplate یک ViewCell هم باید بگزاریم . کار ما سمت XAML تموم شده حالا میریم داخل کد های سی شارپ . حال یک کلاس برای بایند کردن Template به لیست میسازیم به صورت زیر : public class OurLstItems { public string Img { get; set; } public string Text1 { get; set; } public string Text2 { get; set; } public string Text3 { get; set; } } حال یک ObservableCollection از همین کلاس میسازیم . یکی از خاصیت های اصلی ObservableCollection این هست که در صورت اضافه و کم شدن آیتم به صورت خودکار UI نیز آپدیت میشود پس برای راحتی از همین نوع کالکشن استفاده میکنیم و آنرا به صورت یک متغیر سراسری در پیج معرفی میکنیم . ObservableCollection<OurLstItems> items = new ObservableCollection<OurLstItems>(); همچنین جهت عکس یک عکس نمونه کوچک را انتخاب کردم که به شکل سراسری در پروژه تعریف مینماییم . const string image = "http://files.softicons.com/download/system-icons/othoni-afis-icons-by-steven-zangh/png/60x60/Settings.png"; استراتژی جهت لود آیتم های جدید ! برای لود کردن آیتم های جدید لیست باید یک استراتژی در نظر بگیریم که چه زمانی باید ایتم های جدید را لود کنیم . در صورتیکه اطلاعات از اینترنت دریافت میشوند و همانطور که میدانید ممکن است سرعت اینترنت خصوصاً در ایران در بسیاری مواقع پایین باشد لذا لازم است سریع تر این کار را انجام دهیم و گاهی که به عنوان مثال از حافظه دستگاه اطلاعات استخراج میشود با رسیدن به انتهای لیست نیز میتوان این کار را کرد ! به عنوان یک استاندارد من در کد خودم در هر صفحه 20 آیتم جدید تولید میکنم و به برنامه تحویل میدهم (که در سایت های خبری ، موزیک و .... نیز معمولا تعداد آیتم ها 10 ، 15 یا 20 مورد در نظر گرفته میشوند.) private List<OurLstItems> GenerateNewItems() { return new List<OurLstItems>() { new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, }; } حال در Constructor برنامه کالکشن خود را به لیست ویو بایند میکنیم Lst.ItemsSource = items; در لیست ویو های زمارین دو Event به نام های ItemAppearing و ItemDisappearing از این دو تا ایونت جهت فهمیدن اینکه چه آیتمی در حال محو شدن از دید کاربر هستند یا بلعکس چه آیتم هایی در حال اضافه شدن به ویوی برنامه میباشند . تفاوت این دو ایونت در این است که یکی به ابتدای صفحه اشاره دارد و دیگری به انتهای صفحه . اگر میخواهید استراتژی لود آیتم ها به صوتی باشد که در صورت نزدیک شدن به آیتم های پایانی لیست ایتم های جدید لود شود بهتر است از ItemAppearing استفاده نمائیم . همچنین استفاده همزمان از هر دو ایونت میتواند به ما نشان دهد که در گوشی کاربر به صورت همزمان چند آیتم به نمایش در می آید . من در اینجا از ItemAppearing استفاده میکنم و استراتژی به این صورت خواهد بود که 15 آیتم به پایان لیست آیتم های جدید لود خواهم کرد . private void Lst_ItemAppearing(object sender, ItemVisibilityEventArgs e) { var item = e.Item as OurLstItems; var index = items.IndexOf(item); if(items.Count - index <= 15) foreach (var IOA in GenerateNewItems()) { items.Add(IOA); } } کار تمام است فقط به این دلیل که در ابتدای اجرای برنامه آیتمی در لیست وجود ندارد لذا در حین اجرای برنامه هم این سه خط را مینویسیم تا برنامه به درستی کار کند . foreach (var item in GenerateNewItems()) { items.Add(item); } به این ترتیب کد نهایی برنامه ما به صورت زیر خواهد بود : public partial class MainPage : ContentPage { public class OurLstItems { public string Img { get; set; } public string Text1 { get; set; } public string Text2 { get; set; } public string Text3 { get; set; } } const string image = "http://files.softicons.com/download/system-icons/othoni-afis-icons-by-steven-zangh/png/60x60/Settings.png"; ObservableCollection<OurLstItems> items = new ObservableCollection<OurLstItems>(); public MainPage() { InitializeComponent(); Lst.ItemsSource = items; foreach (var item in GenerateNewItems()) { items.Add(item); } } private List<OurLstItems> GenerateNewItems() { return new List<OurLstItems>() { new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, new OurLstItems(){ Img = image, Text1 = $"First{new Random().Next()}", Text2 = $"Second{new Random().Next()}",Text3 = $"Third{new Random().Next()}"}, }; } private void Lst_ItemAppearing(object sender, ItemVisibilityEventArgs e) { var item = e.Item as OurLstItems; var index = items.IndexOf(item); if(items.Count - index <= 15) foreach (var IOA in GenerateNewItems()) { items.Add(IOA); } } } خروجی کار : اگر در تصویر فوق دقیق شوید متوجه خواهید شد که با نسخه UWP تفاوت فراوانی دارد هم آیکن ها کوچک تر هستند و هم خط سوم Text3 نمایش داده نمیشود ! برای حل این مشکل تنها کافیست در کد های XAML یک مشخصه به لیست ویو اضافه نمائید . HasUnevenRows یعنی کد زمل به صورت زیر تغییر خواهد کرد . <ListView x:Name="Lst" ItemAppearing="Lst_ItemAppearing" HasUnevenRows="True"> ..... </ListView>
  21. 2 پسند
    این راه اگه جواب نده راهش BackgroundMediaPlayer هستش . باید یک Windows Runtime Component بسازی که به اون مسج بزنی از فورگراند اون اجرا کنی . خواه ناخواه یک مقدار پیچیده هست ذاتاً روشش . در ضمن این روش که رامتین معرفی کرده برای بیلد 14393 به بعد فقط جواب میده البته مطمئن نیستم . تو داکیومنت مایکروسافت فک کنم نوشته بود 14393 میخواد
  22. 2 پسند
    آموزش برنامه نویسی با Xamain.Forms قسمت پنجم : کد نویسی اختصاصی هر سیستم عامل ! (بخش دوم) همانطور که توی قسمت قبل اشاره شد زمارین از امکانی جهت کد نویسی مخصوص هر سیستم عامل پشتیبانی میکنه . توی قسمت قبل به یک نمونه بسیار ساده پرداختیم که با استفاده از اون میشد متناسب با هر سیستم عامل پیغام مناسب به کاربر نشون بدیم که یکی از ویژگی های بسیار ساده بود . اما توی این قسمت میخوایم یک مقدار حرفه ای تر با Dependency Services کار کنیم و ببینیم واقعاً کجا ها کاربرد داره . قطعاً میدونید که هر سیستم عامل یک سری api مخصوص به خودش رو داره که احتمالا هنوز توی Xamarin.Forms پیاده سازی نشده که نمونه های بسیار بسیار زیادی از این رو میشه توی پلتفرم جدید UWP مشاهده کرد . امکاناتی مثل LiveTile یا کاشی زنده یا ساده تر حتی بستن یک برنامه یا پخش یک فایل موزیک و.... در اینجا چند نمونه کد برای نمونه قرار میدم که از Dependency Services استفاده کردم . کد اول جهت بستن برنامه هست . روش استفاده از این متد هم همونطور که توی قسمت قبل اشاره شد خیلی ساده هست DependencyService.Get<ICloseApplication>().CloseApplication(); خب ابتدا از روی فرمت دستوری که بالا نوشتم مشخصه که اینترفیس مورد نیاز برای کلاس بالا خیلی ساده یک تابع به اسم CloseApplication داره بدون هیچ پارامتری : public interface ICloseApplication { void CloseApplication(); } کلاس بستن برنامه برای اندروید : [assembly:Dependency(typeof(AppCloser))] namespace GettingStarted.Droid.Classes { class AppCloser : ICloseApplication { void ICloseApplication.CloseApplication() { var activity = (Android.App.Activity)Forms.Context; activity.FinishAffinity(); } } } کلاس بستن برنامه برای IOS : [assembly:Dependency(typeof(AppCloser))] namespace GettingStarted.iOS.Classes { class AppCloser : ICloseApplication { public void CloseApplication() { Thread.CurrentThread.Abort(); } } } کلاس بستن برنامه برای UwP و ویندوز فون 8.1 به بالا : [assembly: Dependency(typeof(ClassApp))] namespace GettingStarted.UWP.Classes { class ClassApp : ICloseApplication { public void CloseApplication() { Windows.UI.Xaml.Application.Current.Exit(); } } } یک کلاس دیگه هم اینجا براتون به اشتراک میگذارم کلاس مربوط به اجرای برنامه در Main Thread هر سیستم عامل هست . نحوه استفاده از این کلاس به این شکل هست که دستورات خودتون رو داخل delegate مینویسید ، اگر هم خواستید از دستورات async استفاده کنید به مثل HttpClient یا ... کافیه قبل از delegate کلمه کلیدی async رو اضافه کنید و به صورت async delegate استفاده کنید . به این صورت امکان استفاده از دستورات async به سادگی براتون فراهم میشه . DependencyService.Get<IMainThreedRunner>().Run( /*async if needed*/ delegate { //Your Codes Here; }); برای پیاده سازی اینترفیس کلاس بالا به شکل زیر عمل میکنیم : namespace GettingStarted.Classes { public interface IMainThreedRunner { void Run(Action act); } } کلاس ویژه برای اندروید : [assembly: Dependency(typeof(MainThreedRunner))] namespace GettingStarted.Droid.Classes { class MainThreedRunner : IMainThreedRunner { public void Run(Action act) { new Activity().RunOnUiThread(() => { act.Invoke(); }); } } } کلاس ویژه IOS : [assembly: Dependency(typeof(MainThreedRunner))] namespace GettingStarted.iOS.Classes { class MainThreedRunner : IMainThreedRunner { public void Run(Action act) { UIApplication.SharedApplication.InvokeOnMainThread(delegate { act.Invoke(); }); } } } و در نهایت کلاس ویژه UWP : [assembly: Dependency(typeof(MainThreedRunner))] namespace GettingStarted.UWP.Classes { class MainThreedRunner : IMainThreedRunner { public async void Run(Action act) { await GettingStarted.UWP.MainPage.Dispatch.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, delegate { act.Invoke(); }); } } } در کد بالا به جای MainPage.Dispatcher میتوانید از Windows.UI.Xaml.Window.Current.Dispatcher نیز استفاده کنید که روش بهتری هم هستش ! به همین روش میشه هر کدی رو به میل خودمون توی سیستم عامل های مختلف اجرا کنیم و برای به اشتراک گذاشتن کد هم فقط کافیه مثل بالا اینترفیس و کلاس های مربوط به هر سیستم عامل رو منتشر کنیم . توی قسمت بعدی آموزش به سراغ Custom Renderer خواهیم رفت که کار با خود Custom Renderer مثل تلفظ اسمش یه مقدار مشکله !!! این که چه زمانی باید از Custom Renderer کرد بحثی هست که در قسمت بعدی آموزش بهش میرسیم .
  23. 2 پسند
    @sab2020 مطمئن شو که Microsoft.EntityFrameworkCore.Tools رو توی پروژه ای که توش DbContext هست نصب کرده باشی اگر ارور خاصی میده بفرست تا نظر بدیم
  24. 1 پسند
    ممنون ngame جان راه حل مسئله رو پیدا کردم . دوستان اگر کسی با مشکل من مواجه بود میتونه به سر به لینک زیر بزنه. شیوه کار با اس کیو ال سرور توسط json را تا حدود مطلوبی توضیح داده فقط مشکل اینجاست که زبان اصلی هست JSON in SQL Server 2016: Part 1 of 4 | SQL Server Blog
  25. 1 پسند
    سلام، من همین روش رو برای سورنا به کار بردم و توی موبایل هم کار میکنه و درست هست و حتی ویدیو هم در پس زمینه پخش میشه. ساده ترین راه هم همینه. موفق باشید.
  26. 1 پسند
    بسیار ممنونم از شما دوست عزیز که واسه آموزش این تکنولوژی نوپا و قدرتمند وقت میذاری . امیدوارم اموزش رو تا اخر پیش ببری . هر روز به وین نویس سر میزنم تا ببینم آموزش جدیدی گذاشتی یا نه. آموزش هایی هم که قرار میدین بسیار روون و عالی هست ممنونم از زحماتت و حوصله ای که به خرج میدی.
  27. 1 پسند
    قبل از شروع بخش سوم بهتر هست کمی در مورد تنظیمات اولیه که در کد های بالا قرار دادیم صحبت کنیم: center : با این در آموزش قبل کار کردیم و همونطور که مشخص است، مرکز نقشه در اجرای اول را مشخص می کند. ورودی آن هم طول و عرض جغرافیایی هستند یا ورودی از نوع Geopoint که خود شامل هر دو عدد طول و عرض هست. zoom level : از اسم این تنظیم کاملا مشخص هست. میزان زوم روی نقشه رو مشخص می کند و می تواند عدد صحیحی از 1 تا 20 را دریافت کند. LandmarksVisible : حالت نمایش LandMarksVisible را می توانید برابر True\False قرار دهید. قسمت سوم: دریافت مختصات از نقشه خب اکنون وقت آن رسیده که از نقشه خروجی دریافت کنیم. اگر چه هنوز برای دریافت اطلاعات کامل از نقشه مقداری زوده، پس اون رو به آینده موکول می کنیم و در اینجا تنها مبحص دریافت موقعیت جغرافیایی را بحث می کنیم. Map Control دارای چند اونت هست که بیشترین استفاده ها را : MapTapped MapDoubleTapped MapHolding دارند. با این رویدادها می توانید به راحتی مختصات را دریافت کنید. در اینجا من از MapTapped استفاده می کنم: private async void MapControl1_MapTapped(Windows.UI.Xaml.Controls.Maps.MapControl sender, Windows.UI.Xaml.Controls.Maps.MapInputEventArgs args) { BasicGeoposition location = new BasicGeoposition(); location.Latitude = args.Location.Position.Latitude; location.Longitude = args.Location.Position.Longitude; Geopoint pointToReverseGeocode = new Geopoint(location) } پارامتر ورودی args شامل تمامی خصوصیات جغرافیایی نقشه است. بنابراین می توانیم به سادگی از آن مختصات را دریافت کنیم: BasicGeoposition location = new BasicGeoposition(); location.Latitude = args.Location.Position.Latitude; location.Longitude = args.Location.Position.Longitude; شما می توانید آن را جداگانه استفاده کنید یا آن را در متغیری از نوع Geopoint ذخیره کنید: Geopoint pointToReverseGeocode = new Geopoint(location);
  28. 1 پسند
    قسمت دوم: مقدار دهی اولیه به نقشه در قسمت قبل کار با Map Control رو شروع کردیم و اون رو در برنامه قرار دادیم. در این مرحله می خواهیم به کنترل مپ مقدارهای اولیه بدهیم تا در اجرای اولیه آن مکان را نمایش دهد. کاربرد های مختلفی هم برای تنظیم کردن مکان اولیه وجود دارد، مثلا در قسمت درباره ما نرم افزار شرکتی که می سازید، می توانید موقعیت جغرافیایی آن را قرار دهید. تنظیم کردن اولیه کنترل مپ به دو صورت است: 1. دادن طول و عرض جغرافیایی در این روش مختصات جغرافیایی نقطه مورد نظر را بدست آورده و در کد قرار دهیم! برای مثال من از مختصات زیر استفاده خواهم کرد: 29.369931, 50.934406 اکنون باید یک شی از نوع BasicGeoposition بسازیم که برای ذخیره موقعیت جغرافیایی از آن استفاده می شود. آن را اینگونه مقدار دهی می کنیم: BasicGeoposition cityPosition = new BasicGeoposition() { Latitude = 29.369931, Longitude = 50.934406 }; .... سپس این مختصات را در یک شی Geopoint ذخیره می کنیم: Geopoint cityCenter = new Geopoint(cityPosition); اکنون کافیست پراپرتی Center کنترل مپ را برابر Geopoint که در اینجا cityCenter است قرار دهیم: MapControl1.Center = cityCenter; شما می توانید این کد را در رویداد ها و متدهای مختلفی استفاده کنید. برای مثال من اینگونه استفاده کرده ام: using Windows.Devices.Geolocation; using Windows.UI.Xaml.Controls; namespace Map { public sealed partial class MainPage : Page { BasicGeoposition cityPosition = new BasicGeoposition() { Latitude = 29.369931, Longitude = 50.934406 }; public MainPage() { this.InitializeComponent(); Geopoint cityCenter = new Geopoint(cityPosition); MapControl1.Center = cityCenter; } } } 2. استفاده از موقعیت جغرافیایی دستگاه شما می توانید برای مقدار دهی اولیه Map Control، از موقعیت جغرافیایی فعلی دستگاه استفاده کنید. به این منظور شما باید از متد RequestAccessAsync استفاده کنید. توجه کنید که استفاده از این متد برای اخذ اجازه برای دسترسی به موقعیت جغرافیایی است. در نتیجه باید در package.appxmanifest پروژه و در تب Capabilities گزینه Location را تیک بزنید. اما کد آن به چه صورت خواهد بود؟ ابتدا باید متد RequestAccessAsync را فراخوانی و مقدار خروجی آن را در یک متغیر ذخیره کنیم. var accessStatus = await Geolocator.RequestAccessAsync(); سپس می توانیم با یک ساختار شرطی موارد مختلف را بررسی کنیم. زیرا ممکن است کاربر اجازه دسترسی به سنسور موقعیت یاب یا GPS را ندهد و در نتیجه سبب خطا در برنامه ما شود. switch (accessStatus) { case GeolocationAccessStatus.Allowed: // گرفتن موقعیت فعلی: Geolocator geolocator = new Geolocator(); Geoposition pos = await geolocator.GetGeopositionAsync(); Geopoint myLocation = pos.Coordinate.Point; // تنظیم موقیت فعلی بر روی کنترل نقشه MapControl1.Center = myLocation; MapControl1.ZoomLevel = 12; MapControl1.LandmarksVisible = true; break; case GeolocationAccessStatus.Denied: // دستوراتی که در صورت اجازه ندادن کاربر باید اجرا شود. break; case GeolocationAccessStatus.Unspecified: // دستوراتی که ممکن است سنسور به خوبی کار نکند باید اجرا شود. break; }
این صفحه از پرچمداران بر اساس منطقه زمانی تهران/GMT+04:30 می باشد