דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. WPF מטפל ארוע עבור Template

WPF מטפל ארוע עבור Template

מתוזמן נעוץ נעול הועבר ארכיון code613m
7 פוסטים 2 כותבים 431 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • רחמיםר מנותק
    רחמיםר מנותק
    רחמים מורחק
    כתב ב נערך לאחרונה על ידי
    #1

    עד כמה שהבנתי, ואני מקווה שאני טועה, שכל הTemplate זה לא משהו שקיים בזכרון כמו משתנה מוצהר עם NEW, אלא זה משהו ריק כמו איזה טיפוס כל שהו, ולכן כדי לחבר לזה פקודה צריך לעשות שמיניות באויר עם ICommand, למשל אם אני רוצה להכניס לחצן לתוך פקד של בורר תאריכים כדי שהפקד יעבור ל'היום':

    [code2=vb.net:2enqd55o]Imports System.Windows.Input
    Imports System.Windows.Controls

    Public NotInheritable Class CalendarCommands
    Private Sub New()
    End Sub
    Private Shared ReadOnly _selectTodayCommand As New SelectTodayCommand()

    Public Shared ReadOnly Property SelectToday() As ICommand
        Get
            Return _selectTodayCommand
        End Get
    End Property
    
    Private NotInheritable Class SelectTodayCommand
        Implements ICommand
    
        Public Custom Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged
            AddHandler(ByVal value As EventHandler)
                'CommandManager.AddCanExecuteHandler(value)
            End AddHandler
    
            RemoveHandler(ByVal value As EventHandler)
                'CommandManager.RequerySuggested(value)
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            End RaiseEvent
    
        End Event
    
        Public Function CanExecute(parameter As Object) _
            As Boolean Implements ICommand.CanExecute
            Return TypeOf parameter Is Calendar
        End Function
    
        Public Sub Execute(parameter As Object) Implements ICommand.Execute
            Dim calendar = TryCast(parameter, Calendar)
            If calendar IsNot Nothing Then
                Dim today = DateTime.Today
                calendar.SelectedDate = today
                calendar.DisplayDate = today
                'מה להוסיף כאן כדי שבורר התאריכים יסגר????
            End If
        End Sub
    
    End Class
    

    End Class[/code2:2enqd55o]

    <Style x:Key="DefaultCalendar" TargetType="Calendar" >
                               <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Calendar}">
                            <StackPanel HorizontalAlignment="Center" Name="PART_Root">
                                <CalendarItem Background="{TemplateBinding Control.Background}" 
                                              BorderBrush="{TemplateBinding Control.BorderBrush}" 
                                              BorderThickness="{TemplateBinding Control.BorderThickness}" 
                                              Name="PART_CalendarItem"  
                                              Style="{TemplateBinding Calendar.CalendarItemStyle}" />
                                <Button Content="Today" Command="{x:Static Commands:CalendarCommands.SelectToday}" 
                                        CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    

    כמה זה יכל להיות פשוט אם הלחצן שבתוך ההTemplate היה משהו קיים שאפשר להתיחס אליו בקוד ולכתוב לו פונקציה מטפלת.
    אולי מישהו יחכים אותנו בכל הנושא הזה?

    פורסם במקור בפורום CODE613 ב30/10/2013 18:37 (+02:00)

    תגובה 1 תגובה אחרונה
    0
    • dovidD מחובר
      dovidD מחובר
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #2

      בגלל הבעיות באתר קשה לי לקרוא את הקוד.
      טמפלט זה "הוראות יצירה" לתוכן כל שהוא, וכל פעם בו צריכים אותו יוצרים לפיו את מכלול "ההוראות".
      אפשר להצמיד אירוע פשוט לטמפלט. ממש כמו לכל אלמנט רגיל.

      ICommand שימושי רק:
      א. הפעלת פונקציות שמגיעות עם האובייקט אותו מטמפלטים. לדוגמא פקד שקורא מסמכי PDF, אז כשעושים לו טמפלט מחדש ורוצים שכפתור יפתח PDF ולא אנו כתבנו את השגרה לזה, אז אנו בודקים בהוראות היצרן של הפקד איזה קומנד זה ופשוט מחברים אותו לכפתור ע"י קומנד ביינדינג.
      ב. מתי שאנו עצמנו רוצים לכתוב "ברמה", מה שנקרא MVVM, שאין ללוגיקה (הקוד המעשי) שום תלות בתצוגה (האובייקטים והקוד החזותיים). אז נניח כתבנו לוגיקה לפתיחת קובץ, ואנחנו רוצים לפנות אליה מהתצוגה, אז מתאים להשתמש בקומנד (אני לא חתום על הנוחות הזאת).

      פורסם במקור בפורום CODE613 ב11/11/2013 17:20 (+02:00)

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      0
      • dovidD מחובר
        dovidD מחובר
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #3

        כעת קלטתי מה רצית לעשות.
        בל"נ מחר אראה לך איך אפשר בקלות רבה.

        פורסם במקור בפורום CODE613 ב11/11/2013 17:24 (+02:00)

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        0
        • dovidD מחובר
          dovidD מחובר
          dovid ניהול
          כתב ב נערך לאחרונה על ידי
          #4

          לא, אתמול לא הבנתי לגמרי מה שרצית לעשות.
          כעת שהבנתי, אז המילים "מה להוסיף כאן כדי שבורר התאריכים יסגר" שכתבת שייכים לDataPicker ולא לCalendar.

          אפשר לעשות סתם אירוע לכל אלמנט בטמפלט ממש כמו כל אירוע של כפתור:
          קוד VB

              Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
                  Dim Calendar As Calendar = CType(sender, Button).TemplatedParent
          
                  Dim today = DateTime.Today
                  Calendar.SelectedDate = today
                  Calendar.DisplayDate = today
              End Sub
          

          קוד XAML הכל כמו שהראית רק תחליף את הכפתור:

          <Button Content="Today" Click="Button_Click" />
          

          פורסם במקור בפורום CODE613 ב12/11/2013 15:01 (+02:00)

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          0
          • רחמיםר מנותק
            רחמיםר מנותק
            רחמים מורחק
            כתב ב נערך לאחרונה על ידי
            #5

            עדיין בלחיצה על הכפתור בורר התאריכים לא נסגר.

            דבר נוסף אני בעצם רוצה שאני אשתמש בסטול הזה של בורר תאריכים בדטה-גריד שיש בו עמודה של תאריך וכמו באקסס שכאשר שדה של תאריך בפוקוס יש למשתמש אפשרות ללחוץ על סמל של לוח שנה ואז הלוח שנה נפתח הוא לוחץ על 'היום' ולוח השנה נסגר, דבר כל כך פשוט לכאורא וכל כך קשה לעשות אותו בדוט-נט....

            משהו בצירוף זה:

                <DataGridTemplateColumn Header="Pick a Date">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding myDate}" />
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                                <DataGridTemplateColumn.CellEditingTemplate>
                                    <DataTemplate>
                                        <!--שהבורר יהיה עם לחצן 'היום'-->
                                        <DatePicker SelectedDate="{Binding myDate}" />
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellEditingTemplate>
                            </DataGridTemplateColumn>
            

            פורסם במקור בפורום CODE613 ב12/11/2013 15:27 (+02:00)

            תגובה 1 תגובה אחרונה
            0
            • dovidD מחובר
              dovidD מחובר
              dovid ניהול
              כתב ב נערך לאחרונה על ידי
              #6

              @רחמים

              עדיין בלחיצה על הכפתור בורר התאריכים לא נסגר.

              אתה נורא מרגיז!
              בשאלתך היו שאלות בצורה לא מסודרת.
              עד שאני מבין ועונה לך על שאלה אחת, אתה "פורך" את התשובה בזה ששאלה אחרת שנרמזה קלות (הערה בקוד!) בשאלתך לא נענתה.
              מה הכוונה "עדיין"? חשבת שתוך שעתיים בשמש זה יסתדר?!
              סליחה על החריפות.

              הנה קוד מלא לסגירת הבורר:

              Dim Calendar As Calendar = CType(sender, Button).TemplatedParent
              
              Dim today = DateTime.Today
              Calendar.SelectedDate = today
              Calendar.DisplayDate = today
              
              Dim popup = TryCast(Calendar.Parent, Primitives.Popup)
              If Not IsNothing(popup) Then popup.IsOpen = False
              

              @רחמים

              דבר נוסף אני בעצם רוצה שאני אשתמש בסטול הזה של בורר תאריכים בדטה-גריד שיש בו עמודה של תאריך וכמו באקסס שכאשר שדה של תאריך בפוקוס יש למשתמש אפשרות ללחוץ על סמל של לוח שנה ואז הלוח שנה נפתח הוא לוחץ על 'היום' ולוח השנה נסגר, דבר כל כך פשוט לכאורא וכל כך קשה לעשות אותו בדוט-נט....

              למה זה דבר נוסף?

              פורסם במקור בפורום CODE613 ב12/11/2013 18:51 (+02:00)

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              תגובה 1 תגובה אחרונה
              0
              • רחמיםר מנותק
                רחמיםר מנותק
                רחמים מורחק
                כתב ב נערך לאחרונה על ידי
                #7

                אני מאוד מתנצל על אי ההבנה שקרתה פה 😞

                בכל מקרה עזרת לי מאוד!

                1. אפשר לוותר על כל הקוד VB שהבאתי למעלה בשביל הקומנט ולהסתפק בכמה שורות של קוד שיציגו ויסגרו את הלוח הקופץ.
                2. הבנתי שאכן טמפלט וסטול הם 'רק' תבניות של על פיהן יווצרו דברים קיימים.
                3. יישר כח גדול ! 🙂

                פורסם במקור בפורום CODE613 ב12/11/2013 19:35 (+02:00)

                תגובה 1 תגובה אחרונה
                0

                בא תתחבר לדף היומי!
                • התחברות

                • אין לך חשבון עדיין? הרשמה

                • התחברו או הירשמו כדי לחפש.
                • פוסט ראשון
                  פוסט אחרון
                0
                • דף הבית
                • קטגוריות
                • פוסטים אחרונים
                • משתמשים
                • חיפוש
                • חוקי הפורום