hespico

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

    22
  • تاریخ عضویت

  • آخرین بازدید

  • روز های برد

    13

آخرین بار برد hespico در 3 بهمن 1395

hespico یکی از رکورد داران بیشترین تعداد پسند مطالب است!

اعتبار در سایت

58 عالی

6 دنبال کننده

درباره hespico

  • درجه
    کاربر
  • تاریخ تولد 23 فروردین 751

اطلاعات نمایه

  • جنسیت
    آقا
  • مکان
    طهران
  • علایق
    فوتبال - استراحت - Pes
  • سیستم عامل کامپیوتر
    Windows 10
  • سیستم عامل موبایل
    Windows Phone 8.1

اطلاعات تماس

  • یاهو
    h.mahdiabadi@ymail.com
  • حساب مایکروسافت
    h.mahdiabadi@live.com
  • مرورگر
    Firefox
  • شماره تماس
    09194932050
  • تلگرام
    https://telegram.org/hespico

آخرین بازدید کنندگان نمایه

578 بازدید کننده نمایه
  1. سلام من از سوال شما اینو متوجه شدم میخوایید تا زمانی که یک پردازش به پایان نرسیده ProgrssBar یا چیزی مشابه نمایش داده بشه تا کاربر متوجه بشه عملیات به پایان نرسیده یا منظور دیگه و وقتی این پردازش تمام شدش PrgressBar نمایش داده نشود. برای اینکه میتونید از لینک زیر استفاده کنید (فک کنم آموزش های جالبی هستن خودم استفاده میکنم ازشون) https://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-30-Adding-a-Progress-Indicator http://www.c-sharpcorner.com/UploadFile/2d2d83/progress-bar-and-progress-ring-in-windows-phone-8-1/ اگه مطالب بدرد نخورد بگید خودمون آموزش قرار بدهیم.
  2. سلام واسه قرار دادن برنامه در انجمن بخشی به وجود اومد که هنوز کسی استقبال نکرده به اون صورت. ( نظر سنجی و ... ) به نظر منم پیشنهاد خوبی هستش این پیشنهاد.
  3. سلام به دلیل اینکه در صفحات برنامه وقتی جابجا میشیم صفحات دیده شده داخل Stack میره و تا زمانی که خودتان برای دکمه بک وظیقه ای مشخص نکرده اید ( یعنی با زدن دکمه بک به اون صفحه ای که مد نظر هستش برود بجای اینکه به صفحه ماقبل این صفحه که قرار دارید برود) آخرین صفحه موجود در بالای Stack رابرای شما Pop میکنه و نمایش میدهد ، پس برای اینکه بخواهیم با زدن دکمه بک از برنامه خارج بشه باید Stack را خالی کنیم چون اگر stack خالی باشد و گزینه ای برای Pop کردن وجود نداشته باشد از برنامه خارج میشود و برنامه بسته میشود. protected override void OnBackKeyPress(CancelEventArgs e) { while (NavigationService.CanGoBack) NavigationService.RemoveBackEntry(); base.OnBackKeyPress(e); } // این کد واسه سیلور لایت هستش واسه همین کاری که توضیح دادم باید انجام بدهید. حالا نمیدونم برای یونیورسال هم همین کد کار میکند خیر.
  4. سلام . به نظر من ساده ترین راه حل این هستش که خودت تبدیل کنی تقویم رو به شمسی این لینک یک الگوریتم گفته یه سر بزن بهش ببین چطوره :-))) تبدیل میلادی به شمسی من خودم هم قبلا اینو خونده بودم و پیادش کردم و تست هم کردم کاملا اوکی بوده تا اون تعداد تستی که من انجام دادم. من یک کلاس ساختم که کار تبدیل منو انجام میداد و تاریخ شمسی رو داخل یک رشته ذخیره میکردم. public class PersianDate { private readonly string[] Month = {"null","فروردین","اردیبهشت","خرداد", "تیر","مرداد","شهریور", "مهر","آبان","آذر","دی","بهمن","اسفند"}; private readonly string[] Day = { "یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"}; private string _date; public string Date { set { _date = value; } get { return _date; } } private void MyFunction_() { DateTime d = DateTime.Now.ToLocalTime(); bool checkKabiseh = false; if ((d.Year % 100 != 0) && (d.Year % 4 == 0)) { checkKabiseh = true; } // end if int dayTemp = 0; if (d.DayOfYear > 79) { dayTemp = d.DayOfYear - 79; //first 6 month if (dayTemp <= 186) { if (dayTemp % 31 == 0) { Date = Day[Convert.ToInt32(d.DayOfWeek)] + " " + "31" + " " + Month[dayTemp / 31]; } // end if else { Date = Day[Convert.ToInt32(d.DayOfWeek)] + " " + (dayTemp % 31).ToString() + " " + Month[(dayTemp / 31) + 1]; } // end else } // end if //second 6 month else { dayTemp = dayTemp - 186; if (dayTemp % 30 == 0) { Date = Day[Convert.ToInt32(d.DayOfWeek)] + " " + "30" + " " + Month[(dayTemp / 30) + 6]; } // end if else { Date = Day[Convert.ToInt32(d.DayOfWeek)] + " " + (dayTemp % 30).ToString() + " " + Month[(dayTemp / 30) + 7]; } // end else } // end else } // end if else { if (checkKabiseh) { dayTemp = d.DayOfYear + 11; } // end if else { dayTemp = d.DayOfYear + 10; } // end else if (dayTemp % 30 == 0) { Date = Day[Convert.ToInt32(d.DayOfWeek)] + " " + "31" + " " + Month[(dayTemp / 30) + 9]; } // end if else { Date = Day[Convert.ToInt32(d.DayOfWeek)] + " " + (dayTemp % 30).ToString() + " " + Month[(dayTemp / 30) + 10]; } // end else } // end else } // end method } // end class امیدوارم به دردت بخوره :-)
  5. واسه بکاپ گرفتن و تهیه نسخه پشتیبان میتونی از dropBox هم استفاده کنی که api میده واسه همه پلتفرم ها و نحوه استفاده. چون دیتابیس ما هم یک فایل هستش ما میتونیم خوده فایل رو روی dropBox سیو کنیم یا همون OneDrive. و برای سیستم ثبت نام و لاگ درون برنامه ای هم که بیشتر روی دیتابیس هستش میتونی مثلا یک جدول واسه اینکار درست کنی و ادامه ماجرا.
  6. سلام. ببخشید من اصلا متوجه نوشته شما نشدم میشه کامل تر توضیح بدهید؟
  7. سلام نه هیچ مشکلی نداره با روزهای ماه. ولی بابت سوال دوم اولش یه عذر خواهی میکنم. به خاطر این بودش که جهت حرکت حلقه اشتباه بودش و بعدش باید کمی تغییرات میدادیم واسه تعویض ماه که به صورت زیر میشه : int temp2 = -1; if (time.Month == 1) { temp2 = DateTime.DaysInMonth(time.Year - 1, 12); } // end if else temp2 = time.Day - 1; check = false; int tempDay2 = DateTime.DaysInMonth(time.Year, time.Month - 1); for (int i= (int)time.DayOfWeek - 1; i>=0; i--) { if (check) { dayArray[i] = tempDay2; tempDay2--; } // end if else { dayArray[i] = temp2; if (temp2 == 1) { check = true; } // end if else temp2--; } // end else } // end for داخل کد بالا و پروژه درست کردم دوباره اپلود کردم. ولی واسه سوال سوم اگه بخواهی هفته های قبل و بعد بتونه کاربر بره میتونی هفت روز به هفت روز کم یا زیاد کنی آرایه رو و هرجا به آخر ماه رسید و داریم وارد ماه دیگه میشیم (که با استفاده از تعداد روز های اون ماهی که داخلش هستیم میتونیم اینو متوجه بشیم) دوباره از عدد یک تا آخر ارایه جلو بریم ولی اگه وقتی داریم به هفته قبل تر میریم هر وقت به روز اول رسید تعداد روز های ماه قبل رو مثل بالا حساب میکنیم و یکی یکی کم میکنیم ازش تا به ابتدا آرایه برسیم این واسه تعویض هفته ها و برای تعویض ماه و سال میشه همینکار کردش که فقط یه ذره تغییرات کوچولو داره مثلا به تعداد روز های ماه ظرفیت میدیم و ... . و برای اینکه بفهیم ماه بعد یا هفته بعد سال رو عوض میکنم چه به گذشته چه به آینده یه کار این هستش که شماره ماه مورد نظر رو که الان داخلش هستیم رو بدونیم مثلا اگه الان ما در ماه شماره 12 باشیم با رفتن به جلو سال عوض میشه و یا برعکسش وقتی شماره ماه یک باشه وقتی به گذشته تر بریم سال یکسال کم میشه. :-))
  8. سلام. ساده ترین کاری که به ذهنم رسید این هستش که یک ردیف درست کنید برای اسم روزهای هفته و یک ردیف هم برای چندم بودن در آن روز. اینطور که من از سوالت برداشت داشتم منظورت شما این هستش که دو ردیف داشته باشیم یکی اسم و یکی شماره روز. حالا قسمت گرافیکی برنامه رو من به این صورت درست کردم یعنی قسمت xaml : <Page x:Class="App1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App1" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Loaded="Page_Loaded"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="20"/> <ColumnDefinition/> <ColumnDefinition Width="20"/> </Grid.ColumnDefinitions> <Grid Grid.Column="1" Grid.Row="1"> <StackPanel Orientation="Horizontal" Background="Tomato" x:Name="stack1" Height="35" VerticalAlignment="Top"> <TextBlock Text="یکشنبه" Margin="2" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="دوشنبه" Margin="2" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="سه شنبه" Margin="2" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="چهارشنبه" Margin="2" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="پنجشنبه" Margin="2" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="جمعه" Margin="2" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="شنبه" Margin="2" FontSize="{StaticResource TextStyleMediumFontSize}"/> </StackPanel> <Grid x:Name="grid2" Height="35" VerticalAlignment="Center"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Text="1" Margin="2" Grid.Column="0" HorizontalAlignment="Center" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="" Margin="2" Grid.Column="1" HorizontalAlignment="Center" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="" Margin="2" Grid.Column="2" HorizontalAlignment="Center" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="" Margin="2" Grid.Column="3" HorizontalAlignment="Center" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="" Margin="2" Grid.Column="4" HorizontalAlignment="Center" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="" Margin="2" Grid.Column="5" HorizontalAlignment="Center" FontSize="{StaticResource TextStyleMediumFontSize}"/> <TextBlock Text="" Margin="2" Grid.Column="6" HorizontalAlignment="Center" FontSize="{StaticResource TextStyleMediumFontSize}"/> </Grid> </Grid> </Grid> </Page> حالا برای قسمت سی شارپ یا فایل cs. هم به صورت زیر در می آید : using System; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=391641 namespace App1 { /// <summary> /// An empty page that can be used on its own or navigated to within a Frame. /// </summary> public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; } /// <summary> /// Invoked when this page is about to be displayed in a Frame. /// </summary> /// <param name="e">Event data that describes how this page was reached. /// This parameter is typically used to configure the page.</param> protected override void OnNavigatedTo(NavigationEventArgs e) { // TODO: Prepare page for display here. // TODO: If your application contains multiple pages, ensure that you are // handling the hardware Back button by registering for the // Windows.Phone.UI.Input.HardwareButtons.BackPressed event. // If you are using the NavigationHelper provided by some templates, // this event is handled for you. } private void Page_Loaded(object sender, RoutedEventArgs e) { DateTime time = DateTime.Now.ToLocalTime(); int[] dayArray = new int[7]; dayArray[(int)time.DayOfWeek] = time.Day; // for after bool check = false; int tempDay = time.Day + 1; int j = -1; if (tempDay == DateTime.DaysInMonth(time.Year, time.Month)) check = true; else check = false; for (int i=(int)time.DayOfWeek+1; i<7; i++) { if (check) { if (j == -1) { dayArray[i] = DateTime.DaysInMonth(time.Year, time.Month); j = 1; } else { dayArray[i] = j; j++; } } // end if else { dayArray[i] = tempDay; tempDay++; if (tempDay == DateTime.DaysInMonth(time.Year, time.Month)) check = true; else check = false; } // end else } // end for // for before int temp2 = -1; if (time.Month == 1) { temp2 = DateTime.DaysInMonth(time.Year - 1, 12); } // end if else temp2 = time.Day - 1; check = false; int tempDay2 = DateTime.DaysInMonth(time.Year, time.Month - 1); for (int i= (int)time.DayOfWeek - 1; i>=0; i--) { if (check) { dayArray[i] = tempDay2; tempDay2--; } // end if else { dayArray[i] = temp2; if (temp2 == 1) { check = true; } // end if else temp2--; } // end else } // end for int h = 0; foreach (var st in grid2.Children) { TextBlock tex = (TextBlock)st as TextBlock; if (tex != null) { if (dayArray[h] == time.Day) { tex.Foreground = new SolidColorBrush(Windows.UI.Colors.Yellow); } // end if tex.Text = dayArray[h].ToString(); h++; } // end if } // end foreach } } } حالا بریم سراغ بررسی کد ها : ما ابتدا روزی که الان در آن هستیم رو بدست میاریم و یک آرایه برای روز های هفته با سایز 7 درست میکنیم و روزی که در آن هستیم رو در جای خودش در آرایه قرار می دهیم ( مثلا امروز سه شنبه است باید شماره روز در خانه سوم یا ایندکس دوم آرایه قرار میگرد ، شماره روز به صورت میلادی هستش به خاطر همین روز سه شنبه خانه سوم یا همان ایندکس دوم آرایه قرار میگیره ) : DateTime time = DateTime.Now.ToLocalTime(); int[] dayArray = new int[7]; dayArray[(int)time.DayOfWeek] = time.Day; حالا سه حالت برای هفته ما وجود دارد که باید بررسی کنیم حالت اول : حالتی هستش که تمام هفته در یک ماه هستش. حالت دوم : حالتی هستش که یک یا چند روز از هفته در ماه قبل هستش حالت سوم : حالتی هستش که یک یا چند روز از هفته در ماه بعد هستش حالت اول که هیچ مشکلی نداره و ما بر اساس روز های خانه های آرایه رو پر میکنیم. ولی حالت دوم باید اول بررسی کنیم در چه ماهی هستیم که اگر ماه اول باشد به دلیل تغییر سال باید تغییرات رو اعمال کنیم و آخرین روز ماه قبل را حساب کرده و اگر در ماه اول نباشیم که فقط تعداد روز ها رو کم میکنیم که کد حالت دوم به صورت زیر در میاید : // for before int temp2 = -1; if (time.Month == 1) { temp2 = DateTime.DaysInMonth(time.Year - 1, 12); } // end if else temp2 = time.Day - 1; check = false; int tempDay2 = DateTime.DaysInMonth(time.Year, time.Month - 1); for (int i= (int)time.DayOfWeek - 1; i>=0; i--) { if (check) { dayArray[i] = tempDay2; tempDay2--; } // end if else { dayArray[i] = temp2; if (temp2 == 1) { check = true; } // end if else temp2--; } // end else } // end forend for حالا برای حالت سوم اول بررسی میکنیم که در اگر روز آخر ماه باشیم باید روزهای بعدی از ماه بعد پر شود که دیگر نیازی نیست بدونیم ماه بعد چند روز هستش و فقط از یک تا تعداد مورد نظر جلو میریم و ارایه رو پر میکنیم. یک بررسی دیگر هم باید انجام بدهیم که وقتی داریم ارایه رو پر میکنیم اگر ماه تموم بشه باید روزهای دیگر از ماه بعد انتخاب بشه که کدش به صورت زیر میشود : // for after bool check = false; int tempDay = time.Day + 1; int j = -1; if (tempDay == DateTime.DaysInMonth(time.Year, time.Month)) check = true; else check = false; for (int i=(int)time.DayOfWeek+1; i<7; i++) { if (check) { if (j == -1) { dayArray[i] = DateTime.DaysInMonth(time.Year, time.Month); j = 1; } else { dayArray[i] = j; j++; } } // end if else { dayArray[i] = tempDay; tempDay++; if (tempDay == DateTime.DaysInMonth(time.Year, time.Month)) check = true; else check = false; } // end else } // end for حالا ما تمام خانه های آرایه رو پر کردیم میرسه انتقالش به گرافیک برنامه. اگر بخواهیم دونه دونه مقدار دهی کنیم textBlock را کار منطقی نیستش و تعداد کد های مشابه ما خیلی زیاد میشه. برای راحتی اینکار از حرکت در لایه ای که textblock های یا همان ردیف دوم ما هستش با استفاده از foreach حرکت کرده و بررسی مقدار دهی میکنیم و به برای اینکه نشون بدیم در چه روزی هستیم میتونیم رنگ نوشته روزی که در آن هستیم رو متفاوت تر قرار بدهیم برای نمایش بهتر که به صورت زیر میشود : int h = 0; foreach (var st in grid2.Children) { TextBlock tex = (TextBlock)st as TextBlock; if (tex != null) { if (dayArray[h] == time.Day) { tex.Foreground = new SolidColorBrush(Windows.UI.Colors.Yellow); } // end if tex.Text = dayArray[h].ToString(); h++; } // end if } // end foreach که خروجی برنامه به صورت زیر هستش : و برنامه ساخته شده خودم هم میزارم که شاید بدرتون بخوره : App1.zip من از سوالتون اینی که گفتم رو متوجه شدم اگر منظورت چیز دیگه بودش بگید حتما. بعد من اینو برای روزهای میلادی ساختم اگر منظورتون هم شمسی بودش بگید تا اونو هم بزارم.
  9. سلام بهترین راه همینه که گفته شده . چون میتونیم نگه داشته باشیم فایل برای خودمون.راه دیگه هم با خود ویژوال هستش که میتونید دانلود کنید. Sent from my LG-D802 using Tapatalk
  10. سلام در این آموزش قصد داریم ساخت LongListSelector را آموزش بدهیم. برای اینکار ابتدا یک برنامه ویندوز فونی ایجاد کرده (خود بنده از سیلورلایت استفاده کرده ام ). سپس کد زیر را برای ایجاد LongListSelector ایجاد کرده : <Grid> <phone:LongListSelector x:Name="table" FlowDirection="RightToLeft" Background="Transparent" LayoutMode="List" IsGroupingEnabled="True" HideEmptyGroups="True"/> </Grid> تا اینجا که خیلی راحت بودش. ما میخواهیم یک لیست درست کنیم برای نمایش در LongListSelector ، برای اینکار یک کلاس به نام People ساخته که به شکل زیر میباشد ساختار کلاس ما : public class People { public string Name { set; get; } public string Phone { set; get; } } خب اینم از ساختار کلاس ما که در ادامه ما ازین کلاس یک لیست (List) ساخته برای نمایش. حالا ما در LongListSelector نیاز به چند چیز اعم از کلید (برای نمایش در خونه مربعی کوچک ) که از اولین حرف از فیلد Name از کلاس People به وجود میاید که برای ساخت کلید نیاز به یک کلاس جنریک داریم به نام Group که به صورت زیر میباشد : public class Group<TKey,T>:List<T> { public TKey Key { set; get; } public Group(TKey key,IEnumerable<T> items) :base (items) { this.Key = key; } } در این کلاس برای اینکه ما یک لیست داریم از کلاس List ارث بری میکنیم. حالا برای نمایش در LongListSelector ما نیاز داریم یک ItemTemplate ساخته برای طرز نمایش لیست خودمون. برای اینکه ما یک ItemTemplate بسازیم داخل Resource صفحه یک نمونه ساخته و به لیست خود لینک میزنیم که به صورت زیر میشود : <phone:PhoneApplicationPage.Resources> <DataTemplate x:Key="itemTemplate"> <Grid VerticalAlignment="Top" FlowDirection="RightToLeft"> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition Height="15"/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="15"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Name}" FlowDirection="RightToLeft" FontSize="{StaticResource PhoneFontSizeLarge}" FontWeight="Bold"/> <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Phone}" FlowDirection="RightToLeft" FontSize="{StaticResource PhoneFontSizeMedium}"/> </Grid> </DataTemplate> </phone:PhoneApplicationPage.Resources> خب این برای نحوه دیدن شدن لیست هستش که نحوه لینک دادن به LongListSelector به صورت زیر در می آید : ItemTemplate="{StaticResource itemTemplate}" ما برای نحوه نمایش کلید ها هم نیاز به یک DataTemplate دیگر هم داریم که آن را هم داخل تگ <phone:PhoneApplicationPage.Resources> قرار میدهیم و به صورت زیر میشود : <DataTemplate x:Key="headerTemplate"> <Border Background="Transparent" Padding="5"> <Border Background="{StaticResource PhoneAccentBrush}" BorderBrush="{StaticResource PhoneAccentBrush}" BorderThickness="2" Width="62" Height="62" HorizontalAlignment="Left"> <TextBlock Text="{Binding Key}" Foreground="{StaticResource PhoneForegroundBrush}" FontSize="{StaticResource PhoneFontSizeMedium}" Padding="6" VerticalAlignment="Center" HorizontalAlignment="Center"/> </Border> </Border> </DataTemplate> و با استفاده از دستور زیر به LongListSelector لینک میدهیم : GroupHeaderTemplate="{StaticResource headerTemplate}" حالا ما برای اینکه در یک نما تمام کلید های موجود را داشته باشیم نیاز به یک style داریم که آن را هم داخل تگ <phone:PhoneApplicationPage.Resources>. برای اطلاعات بیشتر در مورد Style میتوانید به لینک زیر بروید : آموزش نوشتن Resource Style که style ما به صورت زیر در می آید : <phone:JumpListItemBackgroundConverter x:Key="BackgroundConverter"/> <phone:JumpListItemForegroundConverter x:Key="ForegroundConverter"/> <Style x:Key="AddrBookJumpListStyle" TargetType="phone:LongListSelector"> <Setter Property="GridCellSize" Value="113,113"/> <Setter Property="LayoutMode" Value="Grid" /> <Setter Property="ItemTemplate"> <Setter.Value> <DataTemplate> <Border Background="{Binding Converter={StaticResource BackgroundConverter}}" Width="113" Height="113" Margin="6"> <TextBlock Text="{Binding Key}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" FontSize="48" Padding="6" Foreground="{Binding Converter={StaticResource ForegroundConverter}}" VerticalAlignment="Center"/> </Border> </DataTemplate> </Setter.Value> </Setter> </Style> که نحوه لینک دادن به LongListSelector به صورت زیر میشود : JumpListStyle="{StaticResource AddrBookJumpListStyle}" خب دیگه تقریبا تمام شده بدونید کار رو فقط مونده قسمت سی شارپ و تهیه لیست از کلاس People و مرتب سازی اعضا لیست بر اساس فیلد (Name) و لینک دادن به LongListSelector. برای اینکار به قسمت cs. صفحه رفته و در قسمت Constructor (سازنده) کد های زیر را وارد کرده : List<People> myList = new List<People>(); myList.Add(new People() { Name = "حسام", Phone = "123" }); myList.Add(new People() { Name = "حسن", Phone = "123" }); myList.Add(new People() { Name = "حسین", Phone = "123" }); myList.Add(new People() { Name = "علی", Phone = "123" }); myList.Add(new People() { Name = "غلام", Phone = "123" }); myList.Add(new People() { Name = "قنبر", Phone = "123" }); myList.Add(new People() { Name = "صابر", Phone = "123" }); myList.Add(new People() { Name = "شروین", Phone = "123" }); myList.Add(new People() { Name = "هادی", Phone = "123" }); myList.Add(new People() { Name = "بهنام", Phone = "123" }); myList.Add(new People() { Name = "سعید", Phone = "123" }); myList.Add(new People() { Name = "مرتضی", Phone = "123" }); myList.Add(new People() { Name = "مجتبی", Phone = "123" }); myList.Add(new People() { Name = "پیمان", Phone = "123" }); myList.Add(new People() { Name = "کیوان", Phone = "123" }); با این کد یک لیست با نام و شماره آنها ساخته. حالا این لیست را بر اساس حرف اول نام آنها گروه بندی کرده و کلید را هم مشخص کرده که به با استفاده از Linq میتوانیم این کارو انجام بدهیم که به صورت زیر میشود : var groups = (from obj in myList group obj by obj.Name.Substring(0,1) into g orderby g.Key select new Group<string, People>(g.Key.Substring(0, 1), g) ); که با استفاده از کلاس Group که ساخته بودیم در ابتدا میتوانیم کلید ها را انجام بدهیم. برای اینکه از حرف اول هر اسم کلید بسازیم یک Substring زده و حرف اول را انتخاب کرده. در این کد برای اینکه هر شخص و اسم یک گروه ساخته نشه در لیست ما از کد زیر استفاده کرده برای گروه سازی مشترک بر اساس حرف اول اسم اشخاص : group obj by obj.Name.Substring(0,1) و در ادامه هم که مرتب سازی بر اساس کلید را انجام داده ایم. حالا نوبت میرسه به قسمت آخر که وصل کردن به LongListSelector هستش که به صورت زیر میباشد : table.ItemsSource = groups.ToList(); خب دیگه تمام شدش. تمام کد قسمت XAML به صورت زیر میباشد : <phone:PhoneApplicationPage x:Class="PhoneApp1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True"> <phone:PhoneApplicationPage.Resources> <DataTemplate x:Key="itemTemplate"> <Grid VerticalAlignment="Top" FlowDirection="RightToLeft"> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition Height="15"/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="15"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Name}" FlowDirection="RightToLeft" FontSize="{StaticResource PhoneFontSizeLarge}" FontWeight="Bold"/> <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Phone}" FlowDirection="RightToLeft" FontSize="{StaticResource PhoneFontSizeMedium}"/> </Grid> </DataTemplate> <DataTemplate x:Key="headerTemplate"> <Border Background="Transparent" Padding="5"> <Border Background="{StaticResource PhoneAccentBrush}" BorderBrush="{StaticResource PhoneAccentBrush}" BorderThickness="2" Width="62" Height="62" HorizontalAlignment="Left"> <TextBlock Text="{Binding Key}" Foreground="{StaticResource PhoneForegroundBrush}" FontSize="{StaticResource PhoneFontSizeMedium}" Padding="6" VerticalAlignment="Center" HorizontalAlignment="Center"/> </Border> </Border> </DataTemplate> <phone:JumpListItemBackgroundConverter x:Key="BackgroundConverter"/> <phone:JumpListItemForegroundConverter x:Key="ForegroundConverter"/> <Style x:Key="AddrBookJumpListStyle" TargetType="phone:LongListSelector"> <Setter Property="GridCellSize" Value="113,113"/> <Setter Property="LayoutMode" Value="Grid" /> <Setter Property="ItemTemplate"> <Setter.Value> <DataTemplate> <Border Background="{Binding Converter={StaticResource BackgroundConverter}}" Width="113" Height="113" Margin="6"> <TextBlock Text="{Binding Key}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" FontSize="48" Padding="6" Foreground="{Binding Converter={StaticResource ForegroundConverter}}" VerticalAlignment="Center"/> </Border> </DataTemplate> </Setter.Value> </Setter> </Style> </phone:PhoneApplicationPage.Resources> <Grid> <phone:LongListSelector x:Name="table" FlowDirection="RightToLeft" Background="Transparent" LayoutMode="List" IsGroupingEnabled="True" HideEmptyGroups="True" ItemTemplate="{StaticResource itemTemplate}" GroupHeaderTemplate="{StaticResource headerTemplate}" JumpListStyle="{StaticResource AddrBookJumpListStyle}"/> </Grid> </phone:PhoneApplicationPage> و تمام کد های قسمت cs. به صورت زیر میباشد : using Microsoft.Phone.Controls; using System.Collections.Generic; using System.Linq; namespace PhoneApp1 { public class Group<TKey,T>:List<T> { public TKey Key { set; get; } public Group(TKey key,IEnumerable<T> items) :base (items) { this.Key = key; } } // end class public class People { public string Name { set; get; } public string Phone { set; get; } } // end class public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); List<People> myList = new List<People>(); myList.Add(new People() { Name = "حسام", Phone = "123" }); myList.Add(new People() { Name = "حسن", Phone = "123" }); myList.Add(new People() { Name = "حسین", Phone = "123" }); myList.Add(new People() { Name = "علی", Phone = "123" }); myList.Add(new People() { Name = "غلام", Phone = "123" }); myList.Add(new People() { Name = "قنبر", Phone = "123" }); myList.Add(new People() { Name = "صابر", Phone = "123" }); myList.Add(new People() { Name = "شروین", Phone = "123" }); myList.Add(new People() { Name = "هادی", Phone = "123" }); myList.Add(new People() { Name = "بهنام", Phone = "123" }); myList.Add(new People() { Name = "سعید", Phone = "123" }); myList.Add(new People() { Name = "مرتضی", Phone = "123" }); myList.Add(new People() { Name = "مجتبی", Phone = "123" }); myList.Add(new People() { Name = "پیمان", Phone = "123" }); myList.Add(new People() { Name = "کیوان", Phone = "123" }); var groups = (from obj in myList group obj by obj.Name.Substring(0,1) into g orderby g.Key select new Group<string, People>(g.Key.Substring(0, 1), g) ); table.ItemsSource = groups.ToList(); } } } و اینم از پروژه ساخته شده هستش که میتوانید دانلود کنید : PhoneApp1.zip و خروجی به صورت زیر میباشد : اگر سوال و مشکلی دارید میتوانید با ایجاد تایپیک جدید مطرح کنید . لطفا در این تایپ مشکلات را مطرح نکنید ، این کار هم باعث منظم شدن انجمن و دسترسی بهتر برای افراد دیگر به مسائل و مشکلات مشابه می شود. مرسی که تا آخر با ما همراه بوده اید.
  11. سلام . بله این امکان وجود دارد با استفاده از Storyborad میتوانید نقطه اولیه دایره ( هم x و هم y ) را ثبت کنید و وقتی دایره رو جابجا کردید محل جدید را هم سیو کنید سپس از نقطه فعلی به نقطه اولیه با استفاده از storyBorad به نقطه اولیه فرستاده میشه. برای ثبت نقطه اولیه میتونیم داخل رخداد ManipulationStarted و مختصات نقطه آخر را هم میتونیم در رخداد ManipulationCompleted بدست بیاریم. دوست عزیز اگر سوالت و مشکلات را در تایپیک جدید بازگو کنید خیلی بهتر میشه .این کار هم باعث منظم شدن انجمن و دسترسی بهتر برای افراد دیگر به مسائل و مشکلات مشابه می شود. مرسی. مرسی
  12. سلام مجدد. من هرچی تلاش کردم که با عمل Pinch بتونیم این حرکت رو در بیارم نشد ولی با استفاده از کتابخانه toolKit که میتونید از nuget خود ویژوال دانلود و نصب کنی یا از این لینک دریافت کنید. که با استفاده از توابع مانند زیر میتونید کاری رو که میخواهید انجام دهید که به صورت زیر استفاده میشود : <toolkit:GestureService.GestureListener> <toolkit:GestureListener PinchDelta="GestureListener_PinchDelta" PinchStarted="GestureListener_PinchStarted"/> </toolkit:GestureService.GestureListener> که هروقت عمل zoom in بودش میتونید مختصات در راستای عمودی (y) را با استفاده از کد بهم نزدیک کنید و همینطور در عمل Zoom out میتوانید عمل برعکس آنرا انجام بدهید. ولی اینکه در هنگام Pinch کردن بتونیم دوتا دایره را handel کنیم حقیقتا نمیشه یا من نتونستم. بعد برای اینکه بفهمیم الان کدام انگشت در کدام قسمت صفحه هستش در عمل pinch کردن نمیشه ولی میتونیم فاصله ی دو تا محل تاچ رو بدست بیاوریم که میتونیم بعدش متوجه بشیم داریم zoom in میشه یا zoom out. ولی اگه بخواهیم بدونیم کجای صفحه الان تاچ شده (غیر از pinch ) میتونیم از کد زیر استفاده کنیم : public MainPage() { InitializeComponent(); Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported); } void Touch_FrameReported(object sender, TouchFrameEventArgs e) { TouchPoint point = e.GetPrimaryTouchPoint(this); Point position = point.Position; MessageBox.Show(position.X.ToString()); // for x MessageBox.Show(position.Y.ToString()); // for y } امیداورم به درتون بخوره. بعد لطفا اگر سوالی دارید یک تایپک جدید ایجاد کنید این تایپیک برای آموزش بودش. مرسی.
  13. سلام. من متوجه سوالت کامل نشدم ولی برداشتم اینه واسه بزرگنمایی یا کوچک نمایی میخوایی این کار رو ؟ اگه جواب مثبت هستش برای بزرگنمایی و کوچک نمایی آموزش حتما قرار میگیره ولی اگه جواب منفی هستش اگه امکان داره بیشتر توضیح بدهی واسه کارت.
  14. سلام. واسه اینکه کاری که داخل صفحه ای انجام داده ای بعد رفتی داخل صفحه بعد و دوباره میخوایی برگردی به اون صفحه لازم نیست کاری انجام بدی ملزم به اینکه stack مربوط به صفحه ها رو خالی نکرده باشی چون میدونیم که از هر صفحه ای وارد صفحه دیگر شویم صفحه مبدا داخل stack سیو میشه با تمام کارها و تغییرات انجام شده داخل اون صفحه. پس وقتی از صفحه ای رفتی به صفحه دیگه با زدن دکمه back از اون stack بالاترین صفحه ( یا اخرین صفحه قبلی که اونجا بودیم ) رو واسه ما بر میگردونه فقط هم با زدن دکمه back این اتفاق میوفته نه اینکه خودمون Navigation کنیم به اون صفحه!! اما اگر چند صفحه رو جابجا بشیم و بخواهیم به یک صفحه بریم که نیاز هستش کارهای انجام شده سیو شده باشه و با زدن دکمه Back به اون صفحه نمیریم راهی که میتونیم اطلاعات و کارهای انجام شده رو recover کنیم این هستش که اطلاعات و کارها رو داخل IsolatedStorageSettings سیو کنیم. واسه خالی کردن stack که صفحه هات رو سیو کرده میتونیم از دستور زیر استفاده کنیم داخل صفحه درزمان زدن دکمه back و با اینکار اگر navigation انجام ندهیم از برنامه خارج میشه : protected override void OnBackKeyPress(CancelEventArgs e) { while (NavigationService.CanGoBack) NavigationService.RemoveBackEntry(); // navigation Code base.OnBackKeyPress(e); } این واسه خالی کردن stack. ولی واسه سیو کردن اطلاعات و دوباره فراخوانی میتوانیم وقتی داریم به صفحه بعد میریم کارها رو اطلاعات مربوط به صفحه را ذخیره کنیم که به صورت زیر ذخیره میشود (همراه با کلید منحصر به فرد ) IsolatedStorageSettings.ApplicationSettings["myWork"] = txtName.Text; IsolatedStorageSettings.ApplicationSettings.Save(); با این کد در کلید myWork سیو کردیم اطلاعات رو. حالا اگه بخواهیم این دیتای سیو شده رو بر گردونیم میتونیم داخل رخداد Loaded صفحه از کد زیر استفاده کرده : try { string mywork = IsolatedStorageSettings.ApplicationSettings["myWork"] as string; txtName.Text = mywork; } catch { } که مقدار سیو شده در کلید مد نظز رو بر میگردونیم و به در جای خود قرار میدهیم . try هم استفاده کردم که اگر مثلا کلید رو نتونست پیدا کنه برنامه کرش نشه دیگه. برداشت من از سوال شما همین بودش نمیدونم حالا درست متوجه شدم سوالتو رو یا نه. در ضمن این کد ها هم واسه سیلورلایت هستش نمیدونم واسه ویندوز فون 8.1 کار میکنه یا نه.(گذاشتم که راهشو گفته باشم ) امیدوارم به دردت بخوره.
  15. سلام دقیقا RelativePanel رو بلد نیستم. ولی در ویندوز فون 8.1 با سیلورلایت خودم این مدلی style دهی میکنم و استفاده میکنم چون ویندوز 10 رو ندارم نمیدونم جواب درستی میده این یا نه ولی روی سیلورلایت 8.1 جواب درست بهم دادش : <Grid> <Grid.Resources> <Style x:Key="myListBox" TargetType="ListBox"> <Setter Property="ItemContainerStyle"> <Setter.Value> <Style TargetType="ListBox"> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> </Style> </Setter.Value> </Setter> <Setter Property="ItemTemplate"> <Setter.Value> <DataTemplate> <StackPanel Background="Red"> <TextBlock Padding="10" FontSize="{StaticResource PhoneFontSizeLarge}" Text="{Binding Name}"/> <TextBlock Padding="10" FontSize="{StaticResource PhoneFontSizeLarge}" Text="{Binding Number}"/> </StackPanel> </DataTemplate> </Setter.Value> </Setter> </Style> </Grid.Resources> <ListBox x:Name="table" Style="{StaticResource myListBox}"> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> </Style> </ListBox.ItemContainerStyle> </ListBox> </Grid> امیدوارم به دردت بخوره :-)