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

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



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

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

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

نوع محتوا


تالار ها

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

گروه


آدرس تارنما


یاهو


اسکایپ


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


شماره تماس


تلگرام


مکان


علایق


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

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

  1. سلام به وین نویسی های عزیز، امروز آموزش استفاده از دیتابیس SQlite در زامارین فرمز رو برای شما آماده کردم. این آموزش بر پایه دیتابیس آماده، درون پروژه می باشد. برای این آموزش نیاز هست که کتابخانه Sqlite-net-pcl رو در هر سه پروژه iOS,Android و UWP نصب کنید. نکته: همیشه ویژوال استودیو را با Run as Administrator باز کنید تا مشکلی برای شما در حین ساخت پروژه، بروز رسانی کتابخانه ها و... پیش نیاید. پروژه ای جدید از نوع Cross Platform App به نام WN XF Database ایجاد نمایید. (نکته: من اینجا اشتباها اومدم توی پوشه ی پروژه های ویژوال استودیو این پروژه رو ایجاد کردم. در اولین نگاه شاید بگید که این که اشکالی نداره، اما وقتی کار کنید میبیند که در پروژه اندروید هر کلاسی که اضافه میشه، عملا رنگ نوشته هاش سفید هست و کار نمیکنه که این به دلیل زیاد شدن آدرس پروژه هست، برای همین بهتر هست همیشه توی پوشه روت درایو هاتون پروژه ها رو بسازید یا حداقل درون یک پوشه درون پوشه روت درایو هاتون ایجاد کنید. من بعد از ساخت پروژه اون رو کات کردم توی درایو G پوشه Sources در کامپیوترم که این مشکل پیش نیاد.) در پنجره بعدی همانند تصویر عمل کنید، یعنی Template از نوع Blank App و UI technology از نوع Xamarin.Forms و Code Sharing strategy از نوع Shared باشه. سپس روی OK کلیک کنید، بعد از این از شما می خواد برای پروژه UWP نسخه SDK تعریف کنید که من 14393 که نسخه سالگرد هست رو انتخاب کردم. پس از ساخت پروژه، پنجره هایی که مربوط به IOS باز شدن رو ببندید. نکته: اگه با ناگت مشکل دارید، یعنی نمی توانید کتابخانه دانلود کنید، نرم افزار Fiddler4 رو دانلود و نصب کنید. پس از نصب آنرا باز کنید و روی WinConfig کلیک کنید، چنانچه از شما پیاپی سوال پرسیده شد، روی YES کلیک کنید تا پنجره ی دیگری برایتان باز شود. در پنجره باز شده روی Exempt all کلیک کنید و روی Save changes کلیک کنید و این پنجره را ببنید. از این پس هر زمانی که میخواهید از ناگت پکیج منیجر استفاده کنید، فقط برنامه Fiddler4 رو باز کنید. روی راه حل (Solution) راست کلیک کنید و روی Manage Nuget Packages for solution را انتخاب کنید. به تب Updates برید و در ابتدا Xamarin.Forms را بروز رسانی کنید، گزینه Xamarin.Forms را تیک بزنید و روی Update کلیک کنید. چنانچه بعد از نصب این قسمت زرد رنگ را دیدید روی Restart کلیک کنید تا ویژوال استودیو ریستارت شود. بعد از ریستارت بصورت خودکار پروژه شما بارگذاری خواهد شد. پس از باز شدن، دوباره به Nuget package manager را باز کنید و در تب Updates همه ی گزینه ها را تیک بزنید و روی Update کلیک کنید تا باقی کتابخانه ها هم بروز رسانی شوند. حال با تب Browse بروید و در قسمت Search این متن را تایپ کنید و اینتر بزنید: sqlite-net-pcl نکته: نسخه های متفاوتی از Sqlite در ناگت وجود دارد اما ما فقط و فقط این نسخه را می خواهیم: این کتابخانه را نصب کنید. نکته: این نسخه توسط Frank a Krueger ساخته شده و تنها نسخه ای هست که اندروید 7 به بالا بدون باگ اجرا میشود. نکته: حتما چک کنید و ببینید که این کتابخانه ها (SQLitePCLRaw) هم خودکار با این پکیج نصب شده باشند، اگر نصب نبودند حتما آنها را خودتان نصب کنیدالبته این عکس مربوط به References پروژه اندروید است. در UWP اینطوری نیست.) حال وقت آن است که دیتابیس را به پروژه اضافه کنیم، من از دیتابیسی که قبلا درون آموزش ساخت کتاب برای ویندوزفون 8.1 ساخته بودم اینجا استفاده کردم. کپی کردن دیتابیس در پروژه UWP. دیتابیس را درون روت پروژه UWP کپی کنید سپس روی آن راست کلیک کرده و روی Properties کلیک کنید. Build Action را روی Content قرار دهید و گزینه Copy to output directory را Copy Always قرار دهید کپی کردن دیتابیس درون پروژه IOS برای اضافه کردن فایل، باید آنها را در پوشه Resources پروژه IOS اضافه کنید. روی دیتابیس راست کلیک کنید و روی Properties کلیک کنید. حتما بررسی کنید که Build Action روی BundleResource و Copy to output روی Copy Always باشد: کپی کردن دیتابیس در پروژه Android در اندروید اضافه کردن فایل به پروژه بسیار جالب است. برای اضافه کردن فایل، ابتدا پوشه ای به نام Raw درون پوشه Resources ایجاد کنید و دیتابیس را درون آن اضافه کنید. روی دیتابیس راست کلیک کرده و Properties را انتخاب کنید و گزینه Build Action را روی AndroidResource و گزینه Copy to output را روی Copy Always قرار دهید. حالا چرا جالبه؟ الان بعد از اضافه کردن فایل به پوشه Raw که ایجاد کردیم، درون پروژه اندروید یک کلاس ایجاد به همین نام ایجاد شد و یک آیدی(شناسه) از نوع Integer برای این فایل ایجاد شد. مثلا برای دسترسی به این فایل درون پروژه اندروید بدین صورت عمل می کنیم: Resources.Raw.myBookDatabase حال شاید برایتان سوال پیش آید که چگونه قرار است این فایل ها را بخوانیم؟! ما باید در پروژه Shared یک اینترفیس interface ایجاد کنید و در هر پروژه به صورت جداگانه دیتابیس را بخوانیم. اینکار را ساخت Dependency می گویند. خب درون پروژه Shared ( پروژه اول درون Solution)، یک کلاس به نام IDatabaseService ایجاد نمایید: فضای نامی SQlite را به قسمت مربوطه اضافه کنید: using SQLite; خب حالا در تعریف کلاس، به جای کلمه class کلمه public interface را بنویسید. الان کدهای زیر را بنویسید: public interface IDatabaseService { SQLiteConnection GetConnection(string fileName); void CopyDatabaseToLocal(string fileName); } خب برای اونهایی که تا حالا با اینترفیس ها کار نکردن، ما اینجا یک تابع بازگشتی به نام GetConnection تعریف کردیم که SQLiteConnection رو باز گردانی خواهد کرد. تابع بعدی، تابع کپی کردن دیتابیس خواهد بود. ما در هر سه پروژه پلتفرم سه کلاس ایجاد خواهیم کرد که از این اینترفیس مشتق میشود. یک کلاس دیگر درون پروژه Shared به نام Extensions ایجاد کنید. این کلاس به صورت static خواهد بود و در واقع یک نوع Extension نویسی برای Exception ها است که قرار است ایجاد کنیم: static class Extensions { public static string Exception(this Exception ex, string starts) { var content = $"{starts} ex: {ex.Message}\r\nSource: {ex.Source}" + $"\r\nTrace: {ex.StackTrace}"; Output(content); return content; } public static void Output(object obj) { System.Diagnostics.Debug.WriteLine(Convert.ToString(obj)); } } تابع اول یک Extension است، تابع را در یک Exception که در try...catch قرار دارد فرا بخوانیم، اگر کد ما استثنا داد، خطا را در پنجره Output ویژوال نمایش خواهد داد(فقط در حالتی که پروژه روی Debug باشد.) خب در پروژه UWP یک کلاس به نام DatabaseService_UWP ایجاد کنید. فضاهای نامی زیر را به قسمت مربوطه اضافه کنید: using System; using SQLite; using Windows.Storage; using System.IO; using Xamarin.Forms; using Windows.ApplicationModel; حالا کلاس اینترفیس را مشتق کلاسی که ایجاد کردید قرار دهید، چنانچه موس را روی IDatabaseService ببرید و روی آن کلیک کنید یک مثلث زیر آن خواهد آمد که خودکار برای شما توابعی که در اینترفیس ایجاد کردیم را برای شما در این کلاس می سازد: تکه کد زیر را پاک کنید: throw new NotImplementedException(); حال کدهای زیر را درون تابع CopyDatabaseToLocal بنویسید: public async void CopyDatabaseToLocal(string fileName) { try { StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName); // injori faghat yebar file ro copy mikonim tuye local folder storageFile = null; return; } catch { } StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync(fileName); await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder); } دیتابیس درون پروژه را به LocalFolder کپی می کنیم. نکته: درون try...catch خط آخر return نوشتیم، اینطوری زمانی که هر بار برنامه باز می شود، اگر فایل دیتابیس درون LocalFolder موجود بود، آنرا کپی نخواهد کرد. این کار برای زمانی است که کاربر بخواهد دیتابیس را بروز رسانی کند و یا آیتمی به آن اضافه کند، اینطوری دیتابیس هر بار ریست نخواهد شد. حال تابع بازگشتی GetConnection را بنویسید: public SQLiteConnection GetConnection(string fileName) { try { var path = Path.Combine(ApplicationData.Current.LocalFolder.Path, fileName); var connection = new SQLiteConnection(path); return connection; } catch (Exception ex) { ex.Exception("DatabaseService_UWP"); } return null; } این تابع کانکشنی به دیتابیس باز می کند که ما بعد از متصل شدن، می توانیم آیتم ها را دریافت کنیم یا اینکه آنها را ویرایش و یا حذف کنیم. خب الان باید تعیین کنیم که این کلاس یک Dependency می باشد. برای اینکار، بالای فضای نامی کد زیر را بنویسید: [assembly: Dependency(typeof(WN_XF_Database.UWP.DatabaseService_UWP))] یعنی اینطوری: [assembly: Dependency(typeof(WN_XF_Database.UWP.DatabaseService_UWP))] namespace WN_XF_Database.UWP { public class DatabaseService_UWP : IDatabaseService حال درون پروژه IOS نیز یک کلاس به نام DatabaseService_IOS ایجاد نمایید. فضاهای نامی زیر را به قسمت مربوطه ی آن اضافه کنید: using SQLite; using System; using System.IO; using Xamarin.Forms; و کلاس آن: [assembly: Dependency(typeof(WN_XF_Database.iOS.DatabaseService_IOS))] namespace WN_XF_Database.iOS { public class DatabaseService_IOS :IDatabaseService { public SQLiteConnection GetConnection(string fileName) { try { var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var libraryPath = Path.Combine(documentsPath, "..", "Library"); var path = Path.Combine(libraryPath, fileName); var connection = new SQLiteConnection(path); return connection; } catch (Exception ex) { ex.Exception("DatabaseService_IOS"); } return null; } public void CopyDatabaseToLocal(string fileName) { try { var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var libraryPath = Path.Combine(documentsPath, "..", "Library"); var path = Path.Combine(libraryPath, fileName); if (!File.Exists(path)) { // daryafte db az masire nasb shodeye barname using (var sourceStream = File.Open("./" + fileName, FileMode.Open, FileAccess.Read)) { FileStream writeStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); ReadWriteStream(sourceStream, writeStream); } } } catch (Exception ex) { ex.Exception("DatabaseService_IOS.CopyDatabaseToLocal"); } } private void ReadWriteStream(Stream readStream, Stream writeStream) { try { int Length = 256; Byte[] buffer = new Byte[Length]; int bytesRead = readStream.Read(buffer, 0, Length); while (bytesRead > 0) { writeStream.Write(buffer, 0, bytesRead); bytesRead = readStream.Read(buffer, 0, Length); } readStream.Close(); writeStream.Close(); } catch (Exception ex) { ex.Exception("DatabaseService_IOS.ReadWriteStream"); } } } } خب کپی کردن دیتابیس از پوشه ی نصبی برنامه پوشه MyDocuments کمی در IOS و اندروید نسبت به UWP فرق داره، همانطور که در بالا می بینید یک تابع private هم برای کپی کردن آن نوشتیم. در پروژه اندروید هم کلاسی به نام DatabaseService_Android ایجاد نمایید. فضاهای نامی مورد نیاز: using SQLite; using System; using System.IO; using System.Threading.Tasks; using Xamarin.Forms; کلاس مورد نظر: [assembly: Dependency(typeof(WN_XF_Database.Droid.DatabaseService_Android))] namespace WN_XF_Database.Droid { public class DatabaseService_Android : IDatabaseService { public SQLiteConnection GetConnection(string fileName) { try { var documentspath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var path = Path.Combine(documentspath, fileName); var connection = new SQLiteConnection(path); return connection; } catch (Exception ex) { ex.Exception("DatabaseService_Android"); } return null; } public async void CopyDatabaseToLocal(string fileName) { try { var documentspath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var path = Path.Combine(documentspath, fileName); if (!File.Exists(path)) { var s = Android.App.Application.Context.Resources.OpenRawResource(Resource.Raw.myBookDatabase); FileStream writeStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); ReadWriteStream(s, writeStream); } await Task.Delay(1); } catch (Exception ex) { ex.Exception("DatabaseService_Android.CopyDatabaseToLocal"); } } private void ReadWriteStream(Stream readStream, Stream writeStream) { try { int Length = 256; Byte[] buffer = new Byte[Length]; int bytesRead = readStream.Read(buffer, 0, Length); while (bytesRead > 0) { writeStream.Write(buffer, 0, bytesRead); bytesRead = readStream.Read(buffer, 0, Length); } readStream.Close(); writeStream.Close(); } catch (Exception ex) { ex.Exception("DatabaseService_Android.ReadWriteStream"); } } } } خب حالا کلاس ها را ذخیره کنید و همه ی آنها را ببندید. در پروژه Shared یک کلاس به نام Dastan ایجاد کنید. این کلاس در اصل مدل دیتابیسی که من در SQLite ساختم، می باشد. فضای نامی مورد نیاز: using SQLite; کلاس داستان: public class Dastan { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string Name { get; set; } public string Story { get; set; } public override string ToString() { return Name.ToString(); } } جدول من دارای سه ستون می باشد. Id برای شناسه، Name برای نام داستان و Story برای متن داستان. کلاس App.xaml.cs را باز کنید. رشته زیر را به صورت constant ایجاد کنید. این رشته نام فایل دیتابیس ما می باشد. چرا constant؟ زیرا نمی خواهیم به اشتباه آنرا تغییر دهیم. (این مقدار فقط readonly یعنی "فقط خواندنی" در نظر گرفته میشود.) public const string DBName = "myBookDatabase.db3"; خب تابع CopyDb را در این کلاس بنویسید: private void CopyDb() { try { DependencyService.Get<IDatabaseService>().CopyDatabaseToLocal(DBName); } catch (Exception ex) { ex.Exception("App.CopyDb"); } } خب این کد شاید برای شما کمی عجیب باشد! اما اینجا فلسفه ساخت Interface و Dependency را یاد خواهید گرفت. کار تابع Get در DependencyService اینه که یک مقدار از نوع T میگیره(T می تونه هر کلاسی باشه) و با در پلتفرم های مختلف کدی که ما ایجاد کردیم رو صدا میزنه. برای مثال اگر ما پروژه UWP را Deploy کنیم، زمانی که به این کد میرسه، DependencyService میاد interfaceـی که ما به نام IDatabaseService ساختیم رو صدا میزنه، این اینترفیس بصورت عادی هیچی نیست اما چون ما کلاس هایی در سه پلتفرم ایجاد کردیم که هم از این اینترفیس مشتق شده بودند و هم به عنوان Dependency اون ها تعریف کرده بودیم، میاد برای هر پروژه اون کلاس مورد نظر در پلتفرم مورد نظر رو صدا میزنه. که در اینجا تابع CopyDatabaseToLocal را فرا میخونه و کار Copy کردن دیتابیس از فولدر نصب شده برنامه به پوشه MyDocuments رو انجام میده. به عبارتی Dependency بصورت خودکار هنگام اجرای این کد میاد اون کدی که ما در پروژه پلتفرمی خاص ایجاد کردیم رو پیدا می کنه و اون رو فرا می خونه. خب حالا درون constructorـه App بعد از فرا خوانیِ InitializeComponent کد زیر را قرار دهید: CopyDb(); یعنی: public App () { InitializeComponent(); CopyDb(); حالا خط بعدی یعنی MainPage =... را به صورت زیر بنویسید: MainPage = new NavigationPage(new MainPage()); چرا NavigationPage؟ زیرا می خواهیم صفحه های جداگانه بسازیم و آنها را باز کنیم. این کلاس را ذخیره کرده و آنرا ببندید. کلاس دیگر در پروژه Shared به نام DatabaseHelper ایجاد نمایید. فضاهای مورد نیاز: using SQLite; using System; using System.Collections.Generic; using System.Linq; using Xamarin.Forms; کلاس مورد نظر: public class DatabaseHelper { SQLiteConnection con; public DatabaseHelper() { try { con = DependencyService.Get<IDatabaseService>().GetConnection(App.DBName); } catch (Exception ex) { ex.Exception("DatabaseHelper"); } } /// <summary> /// Gereftane kole database be sorate liste /// </summary> /// <returns>Liste db ro barmigardone</returns> public IEnumerable<Dastan> Items() { return (from t in con.Table<Dastan>() select t).ToList(); } /// <summary> /// Gereftane yek dastan /// </summary> /// <param name="id">id e dastane morede nazar</param> /// <returns>dastan ro barmigardone</returns> public Dastan GetItem(int id) { return con.Table<Dastan>().FirstOrDefault(t => t.Id == id); } /// <summary> /// Hazfe yek dastan /// </summary> /// <param name="id">id e dastan</param> public void DeleteItem(int id) { con.Delete<Dastan>(id); } /// <summary> /// Ezafe kardane dastan /// </summary> /// <param name="dastan">dastan</param> public void AddItem(Dastan dastan) { con.Insert(dastan); } /// <summary> /// Beroz rasanie dastan /// </summary> /// <param name="dastan">dastan</param> public void UpdateItem(Dastan dastan) { con.Update(dastan); } } فکر نکنم کدها گنگ باشن. فقط در constructor اومدیم با استفاده از DependencyService تابع GetConnection رو صدا زدیم تا SQLiteConnection فرا خوانده بشه. حال کلاس را ذخیره کرده و آنرا ببندید. صفحه طراحی MainPage را باز نمایید و کدهای زیر را بنویسید: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:WN_XF_Database" x:Class="WN_XF_Database.MainPage" Title="WN Db Sample"> <StackLayout> <Label Text="Name" Margin="2"/> <Entry x:Name="txtName" Placeholder="Enter story name"/> <Label Text="Story" Margin="2"/> <Editor x:Name="txtStory" HeightRequest="300"/> <Button x:Name="btnAdd" Text="Add" Clicked="btnAdd_Clicked"/> <Button x:Name="btnShow" Text="Show items" Clicked="btnShow_Clicked"/> </StackLayout> </ContentPage> صفحه را ذخیره کنید، سپس قسمت کدنویسی این صفحه را باز کنید و کدهای دو تابع رویدادهای آن را بنویسید: private void btnAdd_Clicked(object sender, EventArgs e) { var dastan = new Dastan(); var db = new DatabaseHelper(); dastan.Name = txtName.Text; dastan.Story = txtStory.Text; db.AddItem(dastan); } private void btnShow_Clicked(object sender, EventArgs e) { Navigation.PushModalAsync(new StoriesPage()); } تابع رویداد btnAdd_Clicked برای اضافه کردن داستان جدید به دیتابیس است. تابع btnShow_Clicked هم برای باز کردن صفحه ی داستان ها می باشد. StoriesPage صفحه ی ما برای نمایش عناوین داستان ها می باشد. برای ایجاد صفحه ی جدید، روی پروژه Shared راست کلیک کنید و گزینه Add new item را انتخاب کنید. در پنجره ی باز شده، Content Page را انتخاب کنید و نام آنرا StoriesPage قرار دهید. نکته: دو نوع ContentPage وجود دارد، یکی به اسم ContentPage و دیگری به نام ContentPage C# می باشد. نوع اول را انتخاب کنید(اسم بدون C#): کدهای XAML این صفحه را بیاورید و کدهای زیر را درون آن بنویسید: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="WN_XF_Database.StoriesPage" Title="Stories"> <ListView x:Name="StoryListView" SeparatorVisibility="Default"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid HeightRequest="60"> <Grid.GestureRecognizers> <TapGestureRecognizer x:Name="ItemTap" Tapped="ItemTap_Tapped" NumberOfTapsRequired="1"/> </Grid.GestureRecognizers> <Label Text="{Binding Name}" TextColor="Black" VerticalOptions="CenterAndExpand" HorizontalOptions="End" Margin="5"/> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </ContentPage> صفحه را ذخیره کرده و صفحه کدنویسی آنرا باز کنید. فضاهای نامی مورد نیاز: using System; using System.Linq; using Xamarin.Forms; using Xamarin.Forms.Xaml; تابع بازنویسی شده OnAppearing را بنویسید. این تابع در اصل همان تابع Loaded در پروژه های یونیورسال میباشد! protected override void OnAppearing() { base.OnAppearing(); var db = new DatabaseHelper(); var list = db.Items(); Extensions.Output("Story count: " + list.Count()); StoryListView.ItemsSource = list; } آیتم های دیتابیس را به ItemsSourceـه ListView بایند می کنیم. تابع Tapped را برای آیتم ها می نویسیم: private void ItemTap_Tapped(object sender, EventArgs e) { try { var grid = sender as Grid; if (grid == null) return; var dastan = grid.BindingContext as Dastan; if (dastan == null) return; Navigation.PushModalAsync(new ShowStoryPage(dastan)); } catch (Exception ex) { ex.Exception("ItemTapped"); } } چون ما این تابع را برای Grid ساختیم پس sender را Cast می کنیم به Grid سپس BindingContext یا همان مدل بایندینگ را از نوع داستان Cast می کنیم. در آخر صفحه ShowStoryPage را باز می کنیم و اطلاعات را درون Constructor آن میفرستیم. صفحه ای جدید از نوع Content Page درون پروژه Shared ایجاد کنید و نام آنرا ShowStoryPage بگذارید. درون قسمت طراحی این صفحه کدهای زیر را بنویسید: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="WN_XF_Database.ShowStoryPage" Title="Show story"> <ContentPage.Content> <StackLayout> <Label x:Name="txtName" TextColor="Black" HorizontalOptions="End" Font="15" Margin="5"/> <ScrollView> <Label x:Name="txtStory" TextColor="Black" HorizontalOptions="End" HorizontalTextAlignment="End" Margin="10"/> </ScrollView> </StackLayout> </ContentPage.Content> </ContentPage> صفحه را ذخیره کرده و قسمت کدنویسی آنرا باز کنید. در بالای constructor خط زیر را بنویسید: public Dastan CurrentDastan; یک کپی از تابع constructor بگیرید و یک پارامتر ورودی از نوع Dastan به آن اضافه کنید. یعنی: public ShowStoryPage () { InitializeComponent (); } public ShowStoryPage(Dastan dastan) { InitializeComponent(); CurrentDastan = dastan; } حال تابع بازنویسی شده OnAppearing را بنویسید تا اطلاعاتی که بارگذاری شده، را به تکست ها اضافه کنیم: protected override void OnAppearing() { base.OnAppearing(); if (CurrentDastan != null) { txtName.Text = CurrentDastan.Name; txtStory.Text = CurrentDastan.Story; } } به همین راحتی! دانلود سورس کد نمونه منبع: وین نویس
  2. سلام، توی تاپیک قبلی > آموزش ساخت دستیار صوتی و تشخیص گفتار صوتی رو آموزش داده بودم. اما اگه از این کد استفاده کرده باشید می دونید که در بعضی موارد جواب رو نمیده و به احتمال زیاد ف-ی=ل=ت-ر هست. خب برای رفع این مشکل من یه api کوچیک آماده کردم که شما کافیه که فایلی که رکورد کردید رو به این آدرس پست کنید: http://appsoorena.ir/api/wit نمونه کد برای ارسال: async Task<string> GetAsync(StorageFile file) { try { using (HttpClient httpClient = new HttpClient()) { MultipartFormDataContent form = new MultipartFormDataContent(); using (Stream fileStream = (await file.OpenAsync(FileAccessMode.ReadWrite)).AsStream()) { byte[] bytes = ReadStream(fileStream); form.Add(new ByteArrayContent(bytes, 0, bytes.Length), "file", file.Name); HttpResponseMessage response = await httpClient.PostAsync("http://appsoorena.ir/api/wit", form); response.EnsureSuccessStatusCode(); httpClient.Dispose(); string result = response.Content.ReadAsStringAsync().Result; return result; } } } catch (Exception ex) { Debug.WriteLine("Ex: " + ex.Message + "\r\n\r\n" + ex.Source + "\r\n\r\n" + ex.StackTrace); } return ""; } به صورت پیشفرض این میاد از AccessToken من استفاده میکنه و ارسال فایل به ویت رو انجام میده، اگه مایل هستید که از AccessToken خودتون استفاده کنید، کافیه که توی هدر ارسالی نام هدر رو Authorization بذارید و مقدار اون رو برابر با AccessToken خودتون قرار بدید: مثال: httpClient.DefaultRequestHeaders.Add("Authorization", "ACCESS TOKEN E SHOMA"); نکته: این API قابلیت ارسال همزمان چندین فایل رو داره: async Task<string> GetAsync(IReadOnlyList<StorageFile> files) { try { using (HttpClient httpClient = new HttpClient()) { //httpClient.DefaultRequestHeaders.Add("Authorization", "ACCESS TOKEN E SHOMA"); MultipartFormDataContent form = new MultipartFormDataContent(); Dictionary<string, byte[]> dic = new Dictionary<string, byte[]>(); foreach (StorageFile f in files) { using (Stream fileStream = (await f.OpenAsync(FileAccessMode.ReadWrite)).AsStream()) { byte[] bytes = ReadStream(fileStream); string name = f.Name; dic.Add(name, bytes); } } foreach (var f in dic) form.Add(new ByteArrayContent(f.Value, 0, f.Value.Length), "file", f.Key); HttpResponseMessage response = await httpClient.PostAsync("http://appsoorena.ir/api/wit", form); response.EnsureSuccessStatusCode(); httpClient.Dispose(); string result = response.Content.ReadAsStringAsync().Result; return result; } } catch (Exception ex) { Debug.WriteLine("Ex: " + ex.Message + "\r\n\r\n" + ex.Source + "\r\n\r\n" + ex.StackTrace); } return ""; } جواب به صورت لیستی از کلاس WitResponseObject خواهد بود. در اینجا من 8 فایل ارسال کردم که اینم جوابش: [ { "msg_id": "0XuSI5fNDdIXwvg2w", "_text": "برای", "entities": { "intent": [ { "confidence": 1, "value": "کاری " } ] } }, { "msg_id": "0jur6vqRHwR5iULOx", "_text": "دانلود", "entities": { "intent": [ { "confidence": 1, "value": "کاری " } ] } }, { "msg_id": "0bjs6UfOFV5RWxlA6", "_text": "این", "entities": { "intent": [ { "confidence": 1, "value": "کاری " } ] } }, { "msg_id": "0sPszLjV7Emx81ZFo", "_text": "کد", "entities": { "intent": [ { "confidence": 1, "value": "کاری " } ] } }, { "msg_id": "0VUVcyH4DwD3O2rqH", "_text": "زیر", "entities": { "intent": [ { "confidence": 1, "value": "کاری " } ] } }, { "msg_id": "0EqbLSnVxjoIZa3rs", "_text": "راه", "entities": { "intent": [ { "confidence": 1, "value": "کاری " } ] } }, { "msg_id": "0amyxK8K5g1bCqBep", "_text": "اسکن", "entities": { "intent": [ { "confidence": 1, "value": "کاری " } ] } }, { "msg_id": "0Joftm7K5HpGOyNFB", "_text": "کنید", "entities": { "intent": [ { "confidence": 1, "value": "کاری " } ] } } ] موفق باشید. منبع: وین نویس
  3. سلام به دوستان عزیز من قصد نوشتن یه برنامه با زامارین فرمز رو دارم و با توجه به اینکه این برنامه نیاز به یک پایگاه داده قوی برای نگهداری حجم عظیمی داده را دارد و همینطور میزان بالای تراکنش های موجود در لحظه بر روی پایگاه داده و همینطور اینکه این پایگاه داده قرار هست بین تمامی اپ های مربوطه بطور مشترک و بصورت انلاین مورد استفاده قرار بگیره در واقع به این معنی که قرار هست برنامه نوشته بشه برای تمامی پلتفرم های دسکتاپ ، موبایل و وب که یه پایگاه داده مشترک خواهند داشت و دسترسی به پایگاه داده هم بصورت انلاین هست خواستم دوستان اگر تجربه ای در این زمینه دارن راهنمایی کنید که بهترین انتخاب برای همچین منظوری چه پایگاه داده ای هست و روش اتصال رو هم اگر مطلئید توضیح بدید با تشکر. بخوام چند نر افزار مثال بزنم مثل quick of kings که در آن واحد و برای صدها هزار نفر همزمان ارتباط با پایگاه داده برقرار میکنه و بسیار هم روان هست اینها از چه پایگاه داده ای استفاده میکنند و به چه شکل. اگر در مورد Azure هم اطلاعاتی دارید و احتمال داره در این مورد به کارم بیاد هم توضیحاتی ارائه کنید بسیار سپاسگذار میشم. با تشکر از دوستانمون در وینویس
  4. آموزش تبدیل گفتار به نوشتار در ویندوز یکپارچه. کتاب الکترونیک آموزش پیوست شد. پروژه نمونه را می توانید از گیتهاب دانلود نمایید: GitHub - ParseDev/WitAiUWP: Wit Ai Sample for Windows Universal Platfo... نکته چنانچه با این روش مشکل در دریافت دارید، پست زیر رو ببینید: منبع: وین نویس WitAi Speech Recognition.pdf
  5. سلام وقت بخیر، از اونجا که برای دوست عزیزمون بهروز برای پخش موزیک یا ویدیو در پس زمینه مشکل ایجاد شده، فکر کردم این آموزش رو بذارم برای دوستانی که مشکلی مشابه دارند. نکته: من ویژوال استودیو روی کامپیوترم ندارم پس شاید بعضی از کدهام اشتباه تایپی داشته باشند، پس خودتون با 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"); به همین سادگی! موفق باشید. منبع هم که همیشه وین نویس هست!
  6. به نام خدا در این آموزش قصد داریم تا طراحی رابط کاربری بصورت تطبیق پذیر رو فرا بگیریم به این معنی که با تغییرات اندازه ی صفحه ی اپلیکیشن در برنامه تغییرات ظاهری مناسب ایجاد کنیم. خب ابتدا Blend For Visual Studio 2017 رو که همراه با Visual Studio روی سیستم شما نصب شده و برای طراحی اپلیکیشن بکار میره رو باز می کنیم. توجه کنید که کاری که می خواهیم انجام بدیم با Visual Studio هم میشه انجام داد اما باید به صورت دستی کد ها رو وارد کرد که برای افراد غیر حرفه ای اصلا توصیه نمیشه. سپس دیالوگ بعدی را ok کنید خب حالا از Solution Explorer صفحه ی MainPage.XAML رو باز می کنیم و کد زیر رو درونش می نویسیم در نتیجه به این ظاهر می رسیم : حال همونطور که در تصویر زیر مشاهده می کنید ابتدا یک VisualStateGroup می سازیم و نام آن را SplitViewStates می گذاریم در این گروه از State ها (وضعیت های مختلف رابط کاربری) ما می خواهیم حالت های مختلف SplitView را در اندازه های مختلف صفحه مشخص کنیم. و در گام بعدی سه State زیر را به صورتی که می بینید اضافه میکنیم (نام ها دلخواه هستند و تاثیری ندارند) وضعیت Closed را برای زمانی اضافه کردیم که Pane باید بسته باشد. وضعیت Compact برای زمانی که Pane به صورت Compact یا فشرده نمایش داده می شود. و وضعیت open برای زمانی که Pane کامل باز است. در تصویر زیر دو نکته حائز اهمیت است : دکمه ی قرمز به معنی آن است که تغییراتی که ما در Properties هر Element انجام می دهیم برای این State ضبط می شوند. علامت چشم به معنی آن است که در حال مشاهده ی این State درون XAML Designer هستیم. خب حالا میریم سر اصل مطلب! ابتدا State Open را انتخاب می کنیم (علامت قرمز کنارش نمایش داده بشه) و برای آن یک AdaptiveTrigger اضافه میکنیم AdptiveTrigger دو متغیر دارد یکی MinWindowWidth یکی MinWindowHeight که بیانگر این هستند که اگر سایز صفحه (مثلا عرض صفحه) از مقدار متغیر بیشتر شود آن Trigger اتفاق می افتد مثلا اگر MinWindowWidth =500 باشد هنگامی که صفحه از 500 عریضتر شود این تریگر رخ می دهد. حالا که تریگر اضافه شده می تونیم بیایم تغییرات دلخواهمون رو اعمال کنیم توجه داشته باشید که تغییرات رو باید از پنجره ی properties انجام بدیم نه بصورت دستی از XAML! همین کار رو برای دو State دیگر نیز بصورت زیر انجام می دهیم : نکته ی تصویر بالا اینه که ما یه بار تیک رو میزنیم و دوباره برش می داریم تا ویژوال استودیو برای ما کد رو اضافه کنه که ما میخوایم تو این state این پراپرتی false باشه! دلیل اینکه تو تصویر بالا بجای 0 عدد 1 رو گذاشتم این بود که ویژوال استودیو اگر صفر بذاریم فکر میکنه مقدار نمی خواستیم بدیم و در نتیجه تریگر رو اضافه نمی کنه بنابرین 1 گذاشتم بعدا میتونید از خود XAML برید و صفر بذارید جاش خب حالا میایم به همین صورت یک VisualStateGroup دیگه برای اون سه تا مستطیل وسط میسازیم که دو تا State داشته باشه Vertical برای صفحه های کوچک و Horizontal برای صفحه های بزرگ من کد نهایی رو قرار میدم مراحل مثل قبل میمونه فقط پراپرتی Orientation از StackPanel رو اینبار تغییر دادیم: و نتیجه نهایی پایان!
  7. با سلام. امروز با معرفی و آموزش 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 را بزنید و صبر کنید تا تمپلیت استودیو نرم افزار را برایتان کد بزند مشاهده می شود که تمپلیت استودیو بسیار کد تمیز و قابل فهمی را جنریت میکند. که به راحتی قابل شخصی سازی و ادامه ی روند توسعه ی نرم افزار است. در ادامه نرم افزار را اجرا می کنیم به خوبی کار میکند ویندوز تمپلیت استودیو یک پروژه ی متن باز است که می توانید در گیت هاب پیدایش کنید.
  8. با سلام و عرض ادب و احترام خدمت شما. امروز با آموزش اولیه ی انتیتی فریمورک کور در خدمت شما هستیم. در این آموزشی شما : با مفاهیم پایه ای 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) آشنا خواهیم شد.
  9. c#

    با سلام، چگونه میتونم برای فرمت خاصی از فایل ها (برای مثال .winnevis) آیکون خاصی رو بزارم در UWP؟ آیا کلا این امکان وجود دارد؟ اگر وجود دارد برای موبایل هم کار خواهد کرد؟ برای مثال اپلیکیشن Adobe XD که یونیورسال هست و فرمت های .xd با ایکون خاصی به انتخاب این نرم افزار نشان داده میشوند.
  10. c#

    با سلام، من میخواستم که در لاک اسکرین عدد یا اگه بشه متنی رو نشون بدم، چطور میتونم اون کار رو انجام بدم؟ توی سمپل های مایکروسافت یک سمپل در مورد این بود که از کدهاش سر در نیاوردم. حتی با سرچ کردن هم نتونستم این کار رو انجام بدم. (مثل اینکه اسمش LockScreen Badge Notification هست.)
  11. با سلام، چطوری میشه کاشی زنده رو با کد غیر فعال کرد؟
  12. با سلام و آرزوی قبولی طاعات و عبادات، امروز قصد معرفی و آموزش 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) و بسیاری دیگر را به شما خواهد داد. کوچ بیس لایت در عمل: در این_لینک میتوانید داکیومنت های بیشتری را در مورد پیاده سازی کوچ بیس پیدا کنید. گرچه در روز های آتی، درصورت درخواست، آموزشی های اختصاصی تهیه خواهد شد. موید باشید
  13. با سلام، من یک هاست ویندوز دارم و یک پایگاه داده MS SQL در آن. چطور میتونم از طریق اپلیکیشن UWP به این پایگاه داده دسترسی داشته باشم؟ هر چقدر دنبال پایگاه داده mySQL گشتم نتونستم انجام بدم)
  14. با سلام من یک یوزر کنترل ساخته ام حاوی سه تکست بلاک. در کد بیهایند هم دو دپندنسی پراپرتی از نوع int وجود دارد که تکست بلاک اول و دوم از آن بایند میکند. ​اگر بخواهیم که تکست بلاکمان مساوی با حاصلضرب دو دپندنسی پراپرتی فوق باشد چه کنیم؟
  15. درود خدمت همه دات نتی های عزیز.من نمیدونم چه طوری میشه از این استایل های جدید UWP استفاده کرد مشکلم اینه که بلد نیستم چه جوری و کجا API هارو صدا بزنم از طرفی بعضی از این استایل ها و API هاشون Prerelease هستند و خوب من هر چی گشتم نتونستم چیزی پیدا کنم به جز خود داک های مایکرو که گفتم من متوجه نشدم سازز و کار چه جوریایس!!! مشکل اصلی : طرز استفاده از api ها و namespace ها.... https://docs.microsoft.com/en-us/windows/uwp/style/acrylic مثلا اینجا به api هایه مهم اشاره کرده ولی من نمیدونم کجای پروژه باید اون ها رو اد کنم دقیقا. https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.media.acrylicbrush سپاس.
  16. با سلام همانطور که میدانید مایکروسافت هم اکنون روی زبان طراحی جدیدی به نام نئون کار میکند که گرچه به صورت رسمی معرفی نشده است، اما چیز های زیادی از آن لو رفته است. امروز با آموزش پیاده سازی این زبان بر روی اپلیکیشن های یونیورسال در خدمت شما هستیم. نکته : ​این روش بر روی اپلیکیشن برین استودیو که اولین اپلیکیشن نئون موجود در استور است تست شده ​نکته 2: برای اجرای این رابط به بیلد رد استون 2 به بعد و برای توسعه نیاز به اس دی کی رد استون 2 نیار خواهید داشت. ابتدا این سمپل را بگیرید و اما روش پیاده سازی: ابتدا دو پروژه ی "SamplesNative" و "SamplesCommon" را به سولوشن خود اد میکنیم و پروژه ی خود را به آنها رفرنس میدهیم. سپس دو فایل موجود در پوشه ی Assets که در سمپل وجود دارد به نام های Noise.png و Noise.jpg را به پوشه ی Assets پروژه ی خود اضافه میکنیم. بعد از آن نیاز است ایمیج لودر را اینیشالایز کنیم. پس به کانستراکتور پیج اصلی میرویم و زیر اینیشالایز کامپوننت کد زیر را مینویسیم. ImageLoader.Initialize(ElementCompositionPreview.GetElementVisual(this).Compositor); و تقریبا تمام. ​حالا هرجا نیاز به رابط نئون داشتیم از کنترل های مورد نیاز استفاده میکنیم. مثال: xmlns:Neon="using:SamplesCommon" <Neon:HostBackDrop BlurAmount="30" /> در این کتابخانه کنترل های بسیاری وجود دارد. من جمله HostBackDrop که برای بلر کردن ویندوز استفاده میشود، BackDrop که برای بلر کرد اجزا در زمل استفاده می شود و مابقی کنترل ها که در Windows UI Dev Labs توضیح داده شده است. موید باشید
  17. سلام من تازه میخوام برنامه نویسی ویندوز فون رو شروع کنم .. کلاً توی برنامه‌نویسی تازه‌کارم .. یه سوال هست که واقعاً حتی برام فارسی توضیح دادنشم سخته .. اما به کمک عکس سعی میکنم منظورمو به شما عزیزان برسونم تا از کمکتون بهره‌مند شم .. سوالم مربوط میشه به زبان C#‎‎ و برنامه‌نویسی UWP‌ .. میخوام بدونم چجوری باید کاری که پایین میگم رو توی UWP به زبان C#‎‎ انجام بدم .. (درواقع فقط توضیح فارسی میخوام .. یه جورایی میخوام مفهومشو درک کنم) ببینید مثلاً فرض کنید یه اپلیکیشن هست که توش کاربرا عضو میشن و مطلب میزارن .. (عکس زیر رو میزارم تا شاید بهتر متوجه سوالم بشید) درواقع فرض کنید اپلیکیشن فقط 2 صفحه داره .. 1 صفحه مربوط به کل مطالبی که کاربرا گذاشتن 1 صفحه مربوط به جزیئات مطلبی که گذاشتن .. خب میرسیم به جای سخته کار .. که توضیح دادنش برام سخته اما سعی میکنم منظورمو برسونم .. 2 تا صفحه‌ی XAML میسازم تو visual studio .. ظاهر و رنگ‌بندی 2 تا صفحه (قالب) رو مثلاً مثل عکس بالا درست میکنم .. یکیش صفحه‌ی (1) و دومیش صفحه‌ی (2) حالا میخوام بدونم چجوری امکان داره که مثلاً وقتی رو موضوع محمد کلیک کردم، همون قالب صفحه‌ی 2 بیاد اما محتویاتش فرق کنه؟ (محتویاتی باشه که محمد وارد اپلیکیش کرده ـ در واقع تو sql ذخیره شده) و همینطور مثلاً رو موضوع رضا کلیک کردم، صفحه‌ی شماره 2 بیاد (از نظر قالب) اما محتویاتش مثل بالا نباشه .. چیزی باشه که رضا وارد کرده تو اپلیکیشن .. نمیدونم چجوری بیان کنم .. درواقع فقط 2 تا صفحه داریم .. فقط 2 تا .. (صفحه‌ی 1 و 2) اما میخوام داینامیک باشن .. در واقع مثل همین انجمن .. 100 تا تاپیک هست .. که از نظر شکل و شمایش و قالب و رنگ بندی مثل هم هستند .. اما موضوع و اسم نویسنده و مطالب درونیشون با هم فرق داره .. و به طور اتوماتیک هر تاپیک یه شماره‌ی ID داره .. میخوام بدونم چجوری و با چه ساختاری باید همچین کاری کنم؟ یعنی کجا باید دنبال آموزشش باشم .. چی باید سرچ کنم تو نت که برام بیاره .. سَمپل کُدی چیزی .. (اگه آموزش ویدیویی باشه که چه بهتر .. با sql) امیدوارم متوجه منظورم شده باشید .. بسیار ممنون
  18. با سلام سوال داشتم در مورد یوزر کنترل. بنده داخل یوزر کنترلم یک گرید دارم که میخوام Children هاش بایند بشه به Children هایی که بهش میفرستیم. مثال : اگه داخل یوزر کنترل داشته باشیم <UserControl x:Class="MyApp.Controls.Ctrl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:MyApp.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="60" d:DesignWidth="500" > <Grid > </Grid> </UserControl> وقتی که میخواهیم از این یوزر کنترل استفاده کنیم : <local:ctrl > //چیز هایی که میخواهیم بفرستیم تا در آن گرید به عنوان چیلدرن نمایش داده بشوند </local:ctrl> ​چطور باید این کارو رو انجام بدیم ؟ با تشکر.
  19. سلام رفتار ها باعث جلوگیری از تکرار یک کد در درون یک برنامه می شوند. فرض کنید ما میخواهیم که از دکمه های مختلفی داخل برنامه بتوانیم برنامه را ببندیم (از آن خارج شویم), بجای تکرار کد خروج یک بار آن را بصورت رفتار می نویسیم و همه جا از آن استفاده میکنیم. ابتدا نوگت پکیج زیر رو نصب میکنیم : Microsoft.Xaml.Behaviors.uwp.managed بهتره بجای ویژوال استودیو از Blend استفاده کنیم که همراه ویژول نصب شده و مناسب اینجور کار ها هستش (کار های مربوط به رابط کاربری). ابتدا صفحه (Page) مورد نظرتون رو باز کنید. از پنجره ی Assets قسمت Behaviors رو انتخاب کنید. اگر هنوز نوگت رو نصب نکردید اینجا خودش بهتون اجازه میده با یه دکمه نصب کنید. حالا لیست Behavior های آماده رو بهتون نشون میده. پر کاربرد ترینش EventTriggerBehavior هستش که بهتون اجازه میده در هنگام وقوع یک رخداد (event) یک Action رو اجرا کنید . Action ها مثل متد ها هستند یک کار رو انجام میدن و تمام ... لیست اکشن های آماده رو میتونید از همون قسمت Behaviors ببینید. بطور مثال CallMethodAction که یک متد رو صدا میزنه. وقتی از EventTriggerBehavior استفاده میکنیم یک پراپرتی داره به اسم EventName که اسم ایونت ای هستش که مد نظر ماست مثلا کلیک EventName="Click" حالا ما یک رفتار میسازیم که در واکنش به کلیک یک دکمه یک متد رو صدا بزنه <Page .... xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:core="using:Microsoft.Xaml.Interactions.Core" xmlns:behaviors="using:MyApp.Behaviors"> <Grid> <Button Content="Close"> <interactivity:Interaction.Behaviors> <Core:EventTriggerBehavior EventName="Click"> <Core:CallMethodAction MethodName="ButtonClicked" TargetObject="{Binding}"/> </Core:EventTriggerBehavior> </interactivity:Interaction.Behaviors> </Button> </Grid> </Page> حالا کافی است تا متد مورد نظر ما که با نام ButtonClicked مشخص شده درون آبجکتی که در DataContext ما می باشد که معمولا ViewModel ما در معماری MVVM است قرار داشته باشد. با کلیک بر روی دکمه متد مورد نظر اجرا خواهد شد.
  20. سلام رفتار ها باعث جلوگیری از تکرار یک کد در درون یک برنامه می شوند. فرض کنید ما میخواهیم که از دکمه های مختلفی داخل برنامه بتوانیم برنامه را ببندیم (از آن خارج شویم), بجای تکرار کد خروج یک بار آن را بصورت رفتار می نویسیم و همه جا از آن استفاده میکنیم. ابتدا نوگت پکیج زیر رو نصب میکنیم : Microsoft.Xaml.Behaviors.uwp.managed حالا یک کلاس میسازیم که از کلاس زیر ارث بری میکند Behavior<T> تایپT میشه المنت مورد نظر ما که behavior بر روی آن اعمال می شود مثلا ExitButtonBehavior : Behavior<Button> توی کلاس دو تا متد مهم داریم که باید override کنیم OnAttached OnDetaching اولی برای مواقعی هستش که behavior وصل میشه به المنت مورد نظر و دومی برای وقتی که پاک میشه (اتوماتیکه, دست ما نیست) توی این کلاس یه پراپرتی داری به اسم AssociatedObject که میشه آبجکت همون T یعنی مثلا دکمه ای که این رفتار رو بهش وصل کردیم ,و هر کاری که بخواهیم باهاش می تونیم بکنیم مثلا اینجا من یه رفتار ساختم که با کلیک روی دکمه ای که بهش نسبت داده شده برنامه بسته میشه : ExitButtonBehavior : Behavior<Button> ​{ public override void OnAttached() { AssociatedObject.DragOver += MyButton_Click; } public override void OnDetaching() { AssociatedObject.DragOver -= MyButton_Click; } private void MyButton_Click(object sender, RoutedEventArgs e) { Application.Exit(); } } حالا این رفتار رو باید داخل زمل به دکمه ی مورد نظر خودمون اعمال کنیم : <Page .... xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:core="using:Microsoft.Xaml.Interactions.Core" xmlns:behaviors="using:MyApp.Behaviors"> <Grid> <Button Content="Close"> <interactivity:Interaction.Behaviors> <behaviors:ExitButtonBehavior/> </interactivity:Interaction.Behaviors> </Button> </Grid> </Page> و تمام حالا با کلیک روی دکمه برنامه بسته میشه! و قسمت Code Behind صفحه مون دست هم نخورد!
  21. لطفاً آموزش ويديوى رو درست كنيد
  22. سلام؛ من می خوام از فونت یکان، برای نمایش متون در وب ویو برنامه استفاده کنم. متاسفانه از هر روشی رفتم، موفق نشدم. این کلاسی هست که برای این کار نوشتم: class WebContentHelper { public static string HtmlHeader() //adapt parametres { var head = new StringBuilder(); head.Append("<head>"); head.Append("<meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=0\"/>"); head.Append("<script type=\"text/javascript\">" + "document.documentElement.style.msScrollTranslation = 'vertical-to-horizontal';" + "</script>"); //horizontal scrolling //head.Append("<meta name=\"viewport\" content=\"width=720px\">"); head.Append("<style>"); head.Append("@font-face {" + "font-family: 'yekan'" + " url('/other/yekan.ttf') format('ttf');" + "}" + "h1, h2, h3, h4, h5, h6, p{font-family:yekan;}" + "p{font-size{15px;}" + "h1{font-size:25px;}"); head.Append("html { -ms-text-size-adjust:150%;}"); head.Append(string.Format("body {{background:white;color:black;font-size:15px;margin:20;padding:0;display: block;" + "height: 100%;" + "overflow-x: scroll;" + "position: relative;" + "width: 100%;" + "z-index: 0;}}" + "article{{column-fill: auto;column-gap: 80px;column-width: auto; column-height:100%; height:630px;" + "}}" + "img,p.object,iframe {{ max-width:100%; height:auto }}")); head.Append(string.Format("a {{color:blue}}")); head.Append("</style>"); // head.Append(NotifyScript); head.Append("</head>"); return head.ToString(); } public static string WrapHtml(string htmlSubString) { var html = new StringBuilder(); html.Append("<html>"); html.Append(HtmlHeader()); html.Append("<body><article class=\"content\">"); html.Append("<p dir=\"rtl\" align=\"right\">"); html.Append(htmlSubString); html.Append("</p>"); html.Append("</article></body>"); html.Append("</html>"); return html.ToString(); } } متن دلخواه رو باید به متد WrapHtml بدم و بعد در وب ویو به نمایش بذارم: string Content = WebContentHelper.WrapHtml(value); myView.NavigateToString(Content); نمیدونم مشکل چی هست!! اگر کسی عیبی در کدهای من می بینه بفرماید!!
  23. با سلام، من چطوری میتونم مک آدرس دستگاه رو بدست بیارم؟ زیاد گشتم ولی کدهایی که پیدا کردم کار نکردن. و آیا اجازه گرفتن مک آدرس دستگاه کاربر رو دارم؟ یعنی مایکروسافت ایراد نمیگیره؟
  24. سلام، کد XAML: <StackPanel Margin="10,40,0,0"> <TextBlock Text="Simple Camera" FontSize="20"/> <Button Name="myCamButton" Content="Start Camera" Height="40" Width="120" Click="myCamButton_Click"/> <Image Margin="0,20,0,0" Name="capturedImage" Height="300" Width="300"/> </StackPanel> فضاهای نامی مورد نیاز: using Windows.Media.Capture; using Windows.Storage; using Windows.Storage.Streams; using Windows.UI.Xaml.Media.Imaging; کد سی شارپ: async private void myCamButton_Click(object sender, RoutedEventArgs e) { CameraCaptureUI captureUI = new CameraCaptureUI(); captureUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Jpeg; StorageFile photo = await captureUI.CaptureFileAsync(CameraCaptureUIMode.Photo); BitmapImage bitmapImage = new BitmapImage(); using (IRandomAccessStream fileStream = await photo.OpenAsync(FileAccessMode.Read)) { bitmapImage.SetSource(fileStream); } capturedImage.Source = bitmapImage; } نکته: برای استفاده از دوربین باید در فایل package.appxmanifest در تب Capabilities گزینه Microphone را تیک بزنید تا با خطای UnauthorizeAccess مواجه نشوید: پروژه نمونه پیوست شد. موفق باشید. Camera Sample.zip
  25. با سلام، من میخواستم به تراکنش های انجام شده در زرین پال دسترسی داشته باشم، چطوری میتونم با کمک وب سرویس RestFull API این کار رو کنم؟ با تشکر