تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
[تطبيق شامل] {11} - واجهة Smart صناعة الـ Donut Chart
#1
السلام عليكم ورحمة الله وبركاته ..


الدرس السابق :






مشاهدة




https://www.youtube.com/watch?v=-KdRQXkZnMs


اضافة NasteIn
https://marketplace.visualstudio.com/items?itemName=JoseRomaniello.NestIn
الرد }}}
تم الشكر بواسطة: السندبااد , zinom , zinom
#2
درس دسم للغاية، شاهدته مراراً وطبقت معك خطوة بخطوة ولكن صادفتني مشكلتين
الأولى:
حولت الكود التالي :
PHP كود :
root.Children.Cast<UIElement>.Where(=> e.GetType() == typeof(Arc)).ToList().ForEach(=> root.Children.Remove(e)); 

إلى VB.net فلم ينجح وظهر معي خطأ:
PHP كود :
root.Children.Cast(Of UIElement).Where(Function(ee.GetType() Is GetType(Arc)).ToList().ForEach(Function(eroot.Children.Remove(e)) 


فما الكود الصحيح ؟
المشكلة الثانية سآتي إليها بعد أن تتكرم وتجيبني على هذا الاستفسار
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة: zinom , zinom
#3
(13-04-17, 12:32 AM)السندبااد كتب :
درس دسم للغاية، شاهدته مراراً وطبقت معك خطوة بخطوة ولكن صادفتني مشكلتين
الأولى:
حولت الكود التالي :
PHP كود :
root.Children.Cast<UIElement>.Where(=> e.GetType() == typeof(Arc)).ToList().ForEach(=> root.Children.Remove(e)); 

إلى VB.net فلم ينجح وظهر معي خطأ:
PHP كود :
root.Children.Cast(Of UIElement).Where(Function(ee.GetType() Is GetType(Arc)).ToList().ForEach(Function(eroot.Children.Remove(e)) 


فما الكود الصحيح ؟
المشكلة الثانية سآتي إليها بعد أن تتكرم وتجيبني على هذا الاستفسار

نظريا ـ يجب ان يكون شرط الـ where هكذا

(e.GetType() = GetType(Arc

بعتبار ان Is ماتصلح لانها CompiledTime والـ Cast عندنا يساوي UIElement فلن يكون الشرط صحيحا 
الرد }}}
تم الشكر بواسطة: السندبااد , zinom , zinom
#4
أخي العزيز لم يتم حل المشكلة ففي السطر السابق يظهر خطأ هنا:
PHP كود :
root.Children.Remove(e)) 

البرنامج في المرفقات
أرجو التكرم بالاطلاع عليه والمساعدة في حل المشكلة


الملفات المرفقة
.rar   Chart.rar (الحجم : 152.6 ك ب / التحميلات : 48)
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة: zinom , zinom
#5
الحمد لله اكتشفت الخطأ:
   

والكود بعد التصحيح:
PHP كود :
root.Children.Cast(Of UIElement)().Where(Function(ee.GetType() = GetType(Arc)).ToList().ForEach(Sub(eroot.Children.Remove(e)) 

والآن السؤال الذي يطرح نفسه:
أنت قمت بإضافة Arc للأداة في النافذة عن طريق Dialog
   

والسؤال:
كيف ممكن عن طريق الكود بيهاند أضيف ذلك في حدث كليك لزر ما مثلاً، أو في حدث اللود للنافذة
؟!؟!؟
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة: zinom , zinom
#6
(14-04-17, 12:14 AM)السندبااد كتب :
الحمد لله اكتشفت الخطأ:

والكود بعد التصحيح:
PHP كود :
root.Children.Cast(Of UIElement)().Where(Function(ee.GetType() = GetType(Arc)).ToList().ForEach(Sub(eroot.Children.Remove(e)) 

والآن السؤال الذي يطرح نفسه:
أنت قمت بإضافة Arc للأداة في النافذة عن طريق Dialog


والسؤال:
كيف ممكن عن طريق الكود بيهاند أضيف ذلك في حدث كليك لزر ما مثلاً، أو في حدث اللود للنافذة
؟!؟!؟



اولا: نعطي Name للـ GeneralBorder الحاضن للـ DonutChart




ثانيا: الوصول الى الـ Conent تبعه من خلال الكود :
PHP كود :
       //DashboardPage.cs
 
       private void UserControl_Loaded(object senderRoutedEventArgs e)
 
       {

 
           DonutChart chart = ((Grid)chartGeneralBorder.ContentObject).Children.Cast<FrameworkElement>()
 
                               .Where(=> a.GetType() == typeof(DonutChart)).Single() as DonutChart;

 
           chart.Categories.Add(new Usercontrols.DonutCategory()
 
           {
 
               Name "Visits",
 
               Color = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF60C6CF")),
 
               Percent 40
            
});
 
           chart.Categories.Add(new Usercontrols.DonutCategory()
 
           {
 
               Name "Members",
 
               Color = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF989CFF")),
 
               Percent 25
            
});
 
           chart.Categories.Add(new Usercontrols.DonutCategory()
 
           {
 
               Name "Sales",
 
               Color = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF59C5A0")),
 
               Percent 23
            
});
 
           chart.Categories.Add(new Usercontrols.DonutCategory()
 
           {
 
               Name "Lose",
 
               Color = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFF35958")),
 
               Percent 12
            
});
 
       

هذا احد الاساليب .

اما الطريقة المرنة هي باستعمال الـ Binding للـ Categories Property واساندها لـ ViewModel وهذا مايسمى بنمط MVVM Smile
الرد }}}
تم الشكر بواسطة: السندبااد , السندبااد , zinom , zinom
#7
تم تنفيذ الكود الذي وضعته وبالفعل تمت العملية بنجاح ولكن لاحظت أنه لم يتم مسح الـ Arc السابقة، بل تم إضافة الـ Arc الجديدة فوقها كما تشاهد:
   

وأنت ذكرت أنه يجب أن يتم المسح حسب الكود الذي أضفناه في الـ Draw
   
الملف بالمرفقات كي تشاهد على الواقع

.rar   Chart.rar (الحجم : 155.37 ك ب / التحميلات : 36)

أظن أن الحل أن نضيف هذا الكود في زر التحديث، فقد جربته ونجحت العملية:

PHP كود :
PieChart.categories.Clear() 


Wink
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة: zinom , zinom
#8
يبدو انك نسيت ان تحذف الـ Categories السابقين

فانت اضفت في Xaml اربع Categories وثم اضفت في الـ Codebehind اربعا اخرى وبالتالي اصبحت هناك 8 من Categories

اذن لابد من كود الحذف وهو هذا

PHP كود :
   Private Sub button_Click(sender As ObjectAs RoutedEventArgsHandles button.Click
        Dim chart 
As DonutChart TryCast(CType(chartGeneralBorderGrid).Children.Cast(Of FrameworkElement)().Where(Function(aa.GetType() = GetType(DonutChart)).Single(), DonutChart)

 
       'حذف الكاتيغوريس
        PieChart.categories.Clear()
        PieChart.categories.Add(New Chart.DonutCategory() With {.NameA = "Visits", .ColorA = New SolidColorBrush(CType(ColorConverter.ConvertFromString("#FF60C6CF"), Color)), .PercentA = 40})
        PieChart.categories.Add(New Chart.DonutCategory() With {.NameA = "Members", .ColorA = New SolidColorBrush(CType(ColorConverter.ConvertFromString("#FF989CFF"), Color)), .PercentA = 25})
        PieChart.categories.Add(New Chart.DonutCategory() With {.NameA = "Sales", .ColorA = New SolidColorBrush(CType(ColorConverter.ConvertFromString("#FF59C5A0"), Color)), .PercentA = 23})
        PieChart.categories.Add(New Chart.DonutCategory() With {.NameA = "Lose", .ColorA = New SolidColorBrush(CType(ColorConverter.ConvertFromString("#FFF35958"), Color)), .PercentA = 12})
    End Sub 

تحياتي Smile
الرد }}}
تم الشكر بواسطة: السندبااد , zinom
#9
بالفعل أخي الحبيب أنا نسيت الحذف وقد وضعت الكود وصححته
ولكن ردي تم دمجه مع الرد السابق في هذه المشاركة
الآن الأمور تمام التمام وكل شيء غي هذا الدرس تم تطبيقه بنجاح
أسأل الله تعالى أن يسهل عليك إكمال السلسلة
وشكرنا العميق لك
Smile
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة: الشاكي لله , الشاكي لله
#10
ارجو ان تكون فكرة كود الحذف الموجود في Draw مفهومة ، فذلك الكود يحذف الـ Arc Shape من الاداة

لانك لما تغير على قيمة الـ Color لاحد الـ Categories راح يتم استدعاء Draw مباشرة وستقوم برسم 4 arc Shape اضافية

وبالتالي احنا بحاجة الى حذف المنحنيات السابقة Smile


اما ماحصل لديك فهو انك اضفت Categories زيادة من خلال الـ Codebehind فلا علاقة لكود الحذف الموجود في Draw Smile
الرد }}}
تم الشكر بواسطة: السندبااد , zinom , zinom



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم