تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] مشكلة في تحويل الكود من ال #C إلى VB.Net في WPF Custom Control
#1
الأخوة الأعزاء
السلام عليكم ورحمة الله وبركاته
واجهتني مشكلة بسيطة في تحويل الكود من C#.Net إلى VB.Net في تقنية WPF.
انا احاول اعمل WPF Custom control من عدة زراير واريد هذا الكنترول ان يكون متاح لجميع الويندو التي سوف أقوم بعملها في وقت لاحق ، مع استطاعة عمل Mouse Click Overridable.
قمت بتحويل المثال من على الرابط التالي http://alanbeech.wordpress.com/2011/05/0...controls//

وهذه نتيجة التحويل 

كود :
Public Class ExampleControl
       Inherits Control
       Private _clickMeButton As Button
       Private _noMeButton As Button

       ' events exposed to container
       Public Shared ReadOnly OnClickMeClickedEvent As RoutedEvent = EventManager.RegisterRoutedEvent("OnClickMeClicked", RoutingStrategy.Direct, GetType(RoutedEventHandler), GetType(ExampleControl))

       Public Shared ReadOnly OnNoMeClickedEvent As RoutedEvent = EventManager.RegisterRoutedEvent("OnNoMeClicked", RoutingStrategy.Direct, GetType(RoutedEventHandler), GetType(ExampleControl))

       Shared Sub New()
           DefaultStyleKeyProperty.OverrideMetadata(GetType(ExampleControl), New FrameworkPropertyMetadata(GetType(ExampleControl)))
       End Sub

       ' get the button objects as the templete is applied and add click event handlers
       Public Overrides Sub OnApplyTemplate()
           MyBase.OnApplyTemplate()

           _clickMeButton = TryCast(GetTemplateChild("PART_ClickMeButton"), Button)
           _noMeButton = TryCast(GetTemplateChild("PART_NoMeButton"), Button)

           If _clickMeButton IsNot Nothing Then
               AddHandler _clickMeButton.Click, AddressOf ClickMeClicked
           End If
           If _noMeButton IsNot Nothing Then
               AddHandler _noMeButton.Click, AddressOf NoMeClicked
           End If

       End Sub

       ' expose and raise 'OnClickMeClicked' event
       Public Custom Event OnClickMeClicked As RoutedEventHandler
           AddHandler(ByVal value As RoutedEventHandler)
               [AddHandler](OnClickMeClickedEvent, value)
           End AddHandler
           RemoveHandler(ByVal value As RoutedEventHandler)
               [RemoveHandler](OnClickMeClickedEvent, value)
           End RemoveHandler
       End Event

       Private Sub ClickMeClicked(sender As Object, e As RoutedEventArgs)
           [RaiseEvent](New RoutedEventArgs(OnClickMeClickedEvent))
       End Sub

       ' expose and raise 'OnNoMeClicked' event
       Public Custom Event OnNoMeClicked As RoutedEventHandler
           AddHandler(ByVal value As RoutedEventHandler)
               [AddHandler](OnNoMeClickedEvent, value)
           End AddHandler
           RemoveHandler(ByVal value As RoutedEventHandler)
               [RemoveHandler](OnNoMeClickedEvent, value)
           End RemoveHandler
       End Event

       Private Sub NoMeClicked(sender As Object, e As RoutedEventArgs)
           [RaiseEvent](New RoutedEventArgs(OnNoMeClickedEvent))
       End Sub
   End Class
التحويل تم بغير أخطاء
ما عدا سطرين هم التي فيهم الخطاء
 Public Custom Event OnClickMeClicked As RoutedEventHandler
يعطيني الخطاء التالي
'RaiseEvent' definition missing for event 'OnClickMeClicked'
وكذلك هذا السطر
Public Custom Event OnNoMeClicked As RoutedEventHandler
يعطيني نفس الخطاء مع تغيير اسم الكائن.
أرجو منكم أخواني الأعزاء اذا عندكم حل لهذه المشكلة ان لا بتخلوا علي به
ولكم جزيل الشكر والتقدير
الرد }}}}
تم الشكر بواسطة:
#2
السلام عليكم ورحمة الله وبركاته

الفيجوال بيسك فيها فلسفة زيادة لذلك عليك باضافة كود اضافي لتكمل الCustom Event :-

الساينتكس العام للCustom Event :-

PHP كود :
Public Custom Event AnyName As EventHandler

    AddHandler
(ByVal value As EventHandler)
 
       
    End AddHandler

    RemoveHandler
(ByVal value As EventHandler)

 
   End RemoveHandler

    RaiseEvent
(ByVal sender As ObjectByVal e As System.EventArgs)

 
   End RaiseEvent
End Event 


لذلك فقط عليك بوضع هذا الكود زيادة :-

PHP كود :
       RaiseEvent(ByVal sender As ObjectByVal e As RoutedEventArgs)
 
           Me.RaiseEvent(e)
 
       End RaiseEvent 



مع اني اشوف ان استعمال الRoutedEvent من نوع Direct مضيعة للوقت بحكم انك ماتستخدم الClass Handler ولا الEvent Trigger

فلو تستخدم الEvent العادي احسن لك بدل هالدوخة



تحياتي
الرد }}}}
تم الشكر بواسطة: T.ALKATHIRI , hoob computer
#3
(09-11-14, 01:31 AM)الشاكي لله كتب : السلام عليكم ورحمة الله وبركاته



مع اني اشوف ان استعمال الRoutedEvent من نوع Direct مضيعة للوقت بحكم انك ماتستخدم الClass Handler ولا الEvent Trigger

فلو تستخدم الEvent العادي  احسن لك بدل هالدوخة



تحياتي

اخي الشاكي لله

أولاً اشكرك جزيل الشكر على ردك السريع وجزاك الله كل خير

بخصوص ال Routedevent ارجو منك أخي الكريم ان توضح ليّ المسار الصحيح

انا عندي عدة تطبيقات على Window Forms وكل تطبيق فيه حوالي من 10 إلى 20 Forms.

وطبعاً انا مسوي Controls Library وعامل فيها Base form وهذي الفورم تحتوي بالإضافة إلى الشكل العام الموحد ، هناك ايضاً كود موحد مثل سجل جديد تعديل السجل الحالي إلغاء السجل الخ.

ومثل ما حضرتك عارف انه في الويندوز فورم تعمل توريث (Inheritance)  للفورم ويكون جميع الفورمز بشكل واحد ونسق واحد ، وكذلك أعمل Override للأحداث على حسب خصوصية كل فورم.

وانا بصراحة بعد ما شفت الدورة التي عملتها والخاصة بالـ WPF - جزاك الله كل خير - وانا من يومها افكر كيف انقل التطبيقات التي عندي على منصة WPF.

ولكن واجهتني مشكلة انه لا يمكن عمل Visual Inheritance للويندو وهذا هو العائق أمامي الآن للتحويل إلى منصة WPF.

هل فيه طريقة مبسطة لعمل Base window ويتم فيها تعريف Custom Controls ومن ثم تكون هي الشاشة الرئيسية والتي يتم منها التوريث لباقي الشاشات.

وأنا أطمع أخي الكريم في مساعدتك حتى اتم التحويل إلى هذه المنصة الجميلة والممتعة.

وجزاك الله كل خير

شاكر ومقدر إهتمامك.

(09-11-14, 01:31 AM)الشاكي لله كتب : السلام عليكم ورحمة الله وبركاته

الفيجوال بيسك فيها فلسفة زيادة لذلك عليك باضافة كود اضافي لتكمل الCustom Event :-

الساينتكس العام للCustom Event :-


PHP كود :
Public Custom Event AnyName As EventHandler

    AddHandler
(ByVal value As EventHandler)
 
       
    End AddHandler

    RemoveHandler
(ByVal value As EventHandler)

 
   End RemoveHandler

    RaiseEvent
(ByVal sender As ObjectByVal e As System.EventArgs)

 
   End RaiseEvent
End Event 


لذلك فقط عليك بوضع هذا الكود زيادة :-


PHP كود :
       RaiseEvent(ByVal sender As ObjectByVal e As RoutedEventArgs)
 
           Me.RaiseEvent(e)
 
       End RaiseEvent 
ألف مليون شكر على توجيهك
بعد ما عملت مثل ما وضحت لي اشتغل كل شي على خير ما يرام
جزاك الله كل خير وجعله في ميزان حسناتك
كل الشكر والتقدير لك إستاذي العزيز
الرد }}}}
تم الشكر بواسطة:
#4
حسب البحث الذي قمت به ، اغلب المواقع تقول ان xaml لاتدعم الVisual Inheritance

لذلك استعمل الحل البديل وهو usercontol ، يعني اعمل usercontol وسمه BaseWindow

وثم صمم واجهتك في الUsercontrol وبعد الانتهاء قم باضافة هذا الusercontrol الى الwindow1 & window2 & window3 ...الخ


تحياتي
الرد }}}}
تم الشكر بواسطة: T.ALKATHIRI
#5
(10-11-14, 06:01 AM)الشاكي لله كتب : حسب البحث الذي قمت به ، اغلب المواقع تقول ان xaml لاتدعم الVisual Inheritance

لذلك استعمل الحل البديل وهو usercontol ، يعني اعمل usercontol وسمه BaseWindow

وثم صمم واجهتك في الUsercontrol وبعد الانتهاء قم باضافة هذا الusercontrol الى الwindow1 & window2 & window3 ...الخ


تحياتي

شكراً أخي الكريم على ردك
هل يوجد لديك شرح يتطرق لهذا الموضوع وهو كيفية إستخدام ال User Controls لكي يكونوا هم القاعدة التي يتورث منها باقي ال Windows
وهل ممكن أن تتفضل وتعمل شرح وافي يتطرق لل User controsl وال Custom controls
وجزاك الله عنا كل خير
تحياتي وشكري العميق
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سؤال] اخطاء عند تحويل المشروع من net 4.5 إلى net4.0 عبد الله 2 323 13-10-15, 08:59 PM
آخر رد: عبد الله
  Modern Control By WPF - Knob Control (for WPF & Windows Forms) الشاكي لله 2 549 28-07-15, 01:49 PM
آخر رد: الشاكي لله
  ممكن طريقة تحويل WPF الي dll مبرمج أوتار 0 799 13-08-13, 04:39 AM
آخر رد: مبرمج أوتار

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


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