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


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






ماتم الوصول اليه :




مشاهدة





https://www.youtube.com/watch?v=zwtFLp_ONDw

وارجو المعذرة على رداءة الصوت


الملفات المرفقة
.rar   Designtime_Datatrigger.rar (الحجم : 73.64 ك ب / التحميلات : 64)
الرد }}}
تم الشكر بواسطة: السندبااد , السندبااد
#2
وعليكم السلام ورحمة الله وبركاته
الأداة بالفعل أصبحت مرنة جداً 
لكن عندما قمت بعمل Converter للفاصلة في الدقيقة 16 في الفيديو لم توضح لنا كيف قمت بربطه بأداة TextBlock

ألف شكر لك على الدرس الرائع
Smile
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة: الشاكي لله , الشاكي لله
#3
(19-03-17, 11:39 AM)السندبااد كتب :
وعليكم السلام ورحمة الله وبركاته
الأداة بالفعل أصبحت مرنة جداً 
لكن عندما قمت بعمل Converter للفاصلة في الدقيقة 16 في الفيديو لم توضح لنا كيف قمت بربطه بأداة TextBlock

ألف شكر لك على الدرس الرائع
Smile

اي والله شكله راح مع التقطيع هههههههه


لكن الخطوات معروفة ، نكررها دائما :
1- الذهاب الى الـ TextBlock الخاص بعرض البالانس
2- الذهاب الى خاصية Text الخاصة به ، والضغط على المربع -السحري- الذي بجانب الخاصية في الPropreties menu
3- اختيار Create Databinding
4- اختيار Ancestor Binding من القائمة ثم اختيار BalaceUserControl ثم اختيار خاصية Balance 
5- الذهاب الى اسفل الDialog ثم الذهاب الى الـ Converter combobox في الاسفل ، ثم الضغط على Add value Converter ثم واختيار الـclass الخاص بالكونفيرتال المطلوب .

وفي هذا الفيديو (الدرس قبل السابق) قمنا بعمل هذه الخطوات في الدقيقة 17:55
https://www.youtube.com/watch?v=28Xe2vUqMCM

Heart
الرد }}}
تم الشكر بواسطة: السندبااد , السندبااد
#4
هذا ما توقعته بالفعل
Wink
دروس الأدوات مميزة جداً؛ لأن صنع الأداة يوفر الكثير من العناء والوقت
رغم أن البعض يخاف من صنع الأداة ولكن الدروس بسطت الأمور جداً
أسأل الله تعالى أن يجعل ذلك في صحيفة أعمالك وأن يوفقك لإكمال هذه السلسلة الذهبية
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة: الشاكي لله , الشاكي لله
#5
أخي الحبيب الشاكي لله لاحظت أنك أشرت في الدرس أنك في الدروس المقبلة ستشرح عمل Chart إن شاء الله

أرجو لو تكرمت علينا أن يكون الدرس شاملاً لكل ما يتعلق بهذه الأداة لأنها مهمة جداً جداً
وفي تقنية wpf لا يوجد شرح لعملها إنما يوجد أمثلة جاهزة
في الموقع الذي تطبق عليه الدرس وضعوا مثالين لها كما تشاهد
   
الأول: يحدد نسبة كل عنصر من العناصر الموجودة ضمن الـ chart إلى المجموعة؛ كنسبة الناجحين في كل محافظة إلى كامل الدولة.
الثاني: نسبة العنصر لوحده بشكل عام؛ كعدد الناجحين في المنامة نسبة إلى البحرين.

أيضاً تتميز بتغيير اللون والتلميحات والنسبة وغيرها من الخصائص
لأن بالفعل الموقع هذا عرض chart مميزة وشاملة
أقدر اهتمامك ولكن فقط أحببت التذكير والتنويه
Smile

فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة: الشاكي لله
#6
(23-03-17, 02:25 PM)السندبااد كتب :
أخي الحبيب الشاكي لله لاحظت أنك أشرت في الدرس أنك في الدروس المقبلة ستشرح عمل Chart إن شاء الله

أرجو لو تكرمت علينا أن يكون الدرس شاملاً لكل ما يتعلق بهذه الأداة لأنها مهمة جداً جداً
وفي تقنية wpf لا يوجد شرح لعملها إنما يوجد أمثلة جاهزة
في الموقع الذي تطبق عليه الدرس وضعوا مثالين لها كما تشاهد

الأول: يحدد نسبة كل عنصر من العناصر الموجودة ضمن الـ chart إلى المجموعة؛ كنسبة الناجحين في كل محافظة إلى كامل الدولة.
الثاني: نسبة العنصر لوحده بشكل عام؛ كعدد الناجحين في المنامة نسبة إلى البحرين.

أيضاً تتميز بتغيير اللون والتلميحات والنسبة وغيرها من الخصائص
لأن بالفعل الموقع هذا عرض chart مميزة وشاملة
أقدر اهتمامك ولكن فقط أحببت التذكير والتنويه
Smile



نعم ، وانا متخمس كذلك الى صناعة اداتي الـ Chart

بالامس صورت الدرس الثالث من صناعة الاداة الحالية ، ولكن حصلت مشكلة بسببها اوقفت التصوير

وللان لم اجد حل هذه المشكلة للاسف Sad ، حيث باعتقادي انها Bug يتعلق بالBinding في الUsercontrol

المشكلة بسيطة وهي عدم استجابة الMultiValue converter في الdesign time بعد ثاني Call لها

بحثت ولم اصل الى نتيجة ولا حتى اي تلميح ، فالان انا احاول اكتشاف الحل لهذه المشكلة ، ولكن اعطوني مهلة يومين ان استطعت حلها فبها ، وان لم استطع اعدت التصوير وتجاهلتها .

وتحياتي
الرد }}}
تم الشكر بواسطة: السندبااد
#7
أسأل الله تعالى لك التوفيق أستاذي الحبيب وخذ كل وقتك
وبإذن الله تعالى عندما تنشر درس chart سأتابعه جيداً
وسأضع لك أي استفسار أو ملاحظة حتى تخرج الأداة بشكل احترافي ومميز

في هذا الدرس بقي فقط جزئية (تبديل أعمدة الجريد إلى صفوف) عند تصغير حجم النافذة
Smile
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة: الشاكي لله , الشاكي لله
#8
السلام عليكم ورحمة الله وبركاته
كيف جعلت Datatrigger تدعم الديزاين تايم ؟
Huh
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة:
#9
اسف يبدو انني لم اضف السورس للـ Datatrigger المطور ، تم ارافقه في الرد

الطريقة هي باستخدام الوراثة من الـ Microsoft.Expression.Interactivity.Core.DataTrigger

ثم عمل Override الى دالة OnPropertyChanged وهي دالة تنطلق عند اي تغيير يحصل في احد خصائص الـ object في البليند
FrameworkElement.OnPropertyChanged Method - MSDN




فيوجد داخل هذي الدالة كودين اساسيين لجعل هذا الترييغر فعال في الـ DesignTime :
1. 
PHP كود :
this.Actions.ToList().ForEach(=> a.Attach(TargetObject)); 

وظيفته الدوران حول الاكشن المرتبطين بالـ Trigger وعمل Attach لهم للـ TargetObject وهو الـ Control الهدف (مثلا Progressbar)

لأن الـ Attach بطبيعة الحال يتم عند تشغيل البرنامج(runtime) وباتالي يتم ربط الاكشن بالكونترول عند التشغيل
ولكن ماقبل التشغيل في (Design time) لا يتم الربط بعد وبالتالي احتجنا هذا الكود ووضعناه في OnPropertyChanged خصيصا لانها تنطلق في الـDesign Time كذلك Smile




2. 
PHP كود :
this.InvokeActions(null); 


نعرف ان الـTigger وظيفته اطلاق الاكشن ، فهذا الكود ايضا وضغناه اسفل كود Attach ليطلق الاكشن بشكل Force ، اي استدعاء اجباري ، فنعرف ان الـTrigger يقوم باطلاق الاكشن اوتماتيكيا عند تحقق شرط معين ولكن هذا يحصل فقط في الـ Runtime ،  اما في الـDesing Time لابد من العنف واجبار الـTrigger على اطلاق الاكشن رغما عنه عند تحقق الشروط ، لذلك ترى الكود كاملا بهذا الاسلوب  Cool :


PHP كود :
       protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
 
       {

 
           base.OnPropertyChanged(e);
 
           if (TargetObject != null)
 
           {
 
               this.Actions.ToList().ForEach(=> a.Attach(TargetObject));

 
               if (Comparison == ComparisonConditionType.Equal)
 
               {
 
                   if (Binding.ToString() == Value.ToString())
 
                       this.InvokeActions(null);
 
               }
 
               else if (Comparison == ComparisonConditionType.GreaterThan)
 
               {
 
                   if (int.Parse(Binding.ToString()) > int.Parse(Value.ToString()))
 
                       this.InvokeActions(null);
 
               }
 
               else if (Comparison == ComparisonConditionType.GreaterThanOrEqual)
 
               {
 
                   if (int.Parse(Binding.ToString()) >= int.Parse(Value.ToString()))
 
                       this.InvokeActions(null);
 
               }
 
               else if (Comparison == ComparisonConditionType.LessThan)
 
               {
 
                   if (int.Parse(Binding.ToString()) < int.Parse(Value.ToString()))
 
                       this.InvokeActions(null);
 
               }
 
               else if (Comparison == ComparisonConditionType.LessThanOrEqual)
 
               {
 
                   if (int.Parse(Binding.ToString()) <= int.Parse(Value.ToString()))
 
                       this.InvokeActions(null);
 
               }
 
               else if (Comparison == ComparisonConditionType.NotEqual)
 
               {
 
                   if (Binding.ToString() != Value.ToString())
 
                       this.InvokeActions(null);
 
               }
 
           }
 
       


وهذه الطريقة يمكنك استعمالها مع بقية الـTrigger وتطويرها بنفس الاسلوب لتدعم الـDesign Time
بشرط ان لاتقوم باضافة ConditionList ـ لان الـ Condition يحتاج تطوير ايضا ليدعم الـ DesignTime وتطويره معقد نوعا ما وعند تطويره اساسا ستكون مجبرا على كتابة الـ ConditionList يدويا بـ Xaml ، فلا يمكنك استعمال المربع  Sad  :



الملفات المرفقة
.rar   ActionsBehaviors_Helper.rar (الحجم : 417.11 ك ب / التحميلات : 48)
الرد }}}
تم الشكر بواسطة: السندبااد
#10
شكراً للتوضيح أستاذي العزيز
بخصوص التلوين الأوتوماتيكي للبروجريس بار، يوجد طريقة أخرى، جربتها وقد نجحت
وهي طريقة Convert وهي تدعم الديزاين تايم، وهذا هو الكود:



PHP كود :
    Public Function Convert(value As ObjecttargetType As Typeparameter As Objectculture As CultureInfo) As Object Implements IValueConverter.Convert
        Dim TimeRemaining 
As Double System.Convert.ToDouble(value)
        If TimeRemaining And TimeRemaining 25 Then
            
Return New SolidColorBrush(Colors.Red)
        ElseIf TimeRemaining >= 25 And TimeRemaining 50 Then
            
Return New SolidColorBrush(Colors.Orange)
        ElseIf TimeRemaining >= 50 And TimeRemaining 75 Then
            
Return New SolidColorBrush(Colors.Blue)
        ElseIf TimeRemaining >= 75 Then
            
Return New SolidColorBrush(Colors.Green)
        End If
    End Function 
فاعلم أنه لا إله إلا الله
الرد }}}
تم الشكر بواسطة:



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


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