Zeus UpDownControls Ver. 1.0
|
|
- Αμφιτρίτη Ουζουνίδης
- 6 χρόνια πριν
- Προβολές:
Transcript
1 Zeus UpDownControls Ver. 1.0 Manual Copyright 2018 Χρήστος Μουρατίδης
2 Zeus UpDownControls Πίνακας περιεχομένων ZEUS UPDOWNCONTROLS VERSION ΟΙ ΟΡΙΣΜΟΙ ΤΩΝ ΚΛΑΣΕΩΝ... 6 ΔΙΑΝΟΜΗ ΕΠΙΚΟΙΝΩΝΙΑ UPDOWNBASE ΙΔΙΟΤΗΤΕΣ ButtonsWidth ErrorMessageOnIncorrectValueType ErrorMessageOnValueOutOfRange ErrorTemplate HasError IsMinimum IsMaximum ValueFormat ΑΡΙΘΜΗΤΙΚΟΙ ΤΥΠΟΙ BYTEUPDOWN ΙΔΙΟΤΗΤΕΣ Increment Minimum Maximum Value ΣΥΜΒΑΝΤΑ MinimumChanged MaximumChanged ValueChanged SHORTUPDOWN ΙΔΙΟΤΗΤΕΣ Increment Minimum Maximum Value ΣΥΜΒΑΝΤΑ MinimumChanged MaximumChanged ValueChanged INTEGERUPDOWN ΙΔΙΟΤΗΤΕΣ Increment Minimum Maximum Value ΣΥΜΒΑΝΤΑ MinimumChanged MaximumChanged Σελίδα 1
3 Zeus UpDownControls ValueChanged LONGUPDOWN ΙΔΙΟΤΗΤΕΣ Increment Minimum Maximum Value ΣΥΜΒΑΝΤΑ MinimumChanged MaximumChanged ValueChanged SINGLEUPDOWN ΙΔΙΟΤΗΤΕΣ Increment Minimum Maximum Value ΣΥΜΒΑΝΤΑ MinimumChanged MaximumChanged ValueChanged DOUBLEUPDOWN ΙΔΙΟΤΗΤΕΣ Increment Minimum Maximum Value ΣΥΜΒΑΝΤΑ MinimumChanged MaximumChanged ValueChanged DECIMALUPDOWN ΙΔΙΟΤΗΤΕΣ Increment Minimum Maximum Value ΣΥΜΒΑΝΤΑ MinimumChanged MaximumChanged ValueChanged ΗΜΕΡΟΜΗΝΙΕΣ DATEPICKERUPDOWN ΑΠΑΡΙΘΜΗΣΕΙΣ IncrementTypeEnum ΙΔΙΟΤΗΤΕΣ CalendarStyle Σελίδα 2
4 Zeus UpDownControls DatePickerWatermark DisplayDate DisplayDateStart DisplayDateEnd FirstDayOfWeek Increment IncrementType IsDropDownOpen IsTodayHighlighted SelectedDate SelectedDateFormat Text ΣΥΜΒΑΝΤΑ SelectedDateChanged ΜΕΘΟΔΟΙ AddBlackoutDates RemoveBlackoutDates ClearBlackoutDays ΠΑΡΑΡΤΗΜΑ 1: Η ΚΛΑΣΗ CUSTOMER ΠΑΡΑΡΤΗΜΑ 2: Η ΚΛΑΣΗ ΜΕΤΑΤΡΟΠΗΣ ΤΙΜΗΣ DOUBLETOGRIDLENGTHCONVERTER Σελίδα 3
5 Zeus UpDownControls Zeus UpDownControls version 1.0 Κλάσεις: ByteUpDown, ShortUpDown, IntegerUpDown, LongUpDown, SingleUpDown, DoubleUpDown, DecimalUpDown, DatePickerUpDown Βασική κλάση: UpDownBase Inherits: System.Windows.Controls.Control Namespace: Zeus.WPF.Controls.UpDownControls Assembly: ZeusUpDownControls (in ZeusUpDownControls.dll) Dependencies: - Περιγραφή Η βιβλιοθήκη Zeus UpDownControls περιλαμβάνει ένα σύνολο από εξειδεικευμένα UpDown controls, κυρίως για είσοδο αριθμητικών δεδομένων συγκεριμένου τύπου (π.χ. Byte, Short, Integer κλπ) αλλά και ημερομηνίας (DateTime). Ο έλεγχος των εισαγόμενων δεδομένων πραγματοποιείται μέσω εξειδικευμένων ValidationRules που έχουν ενσωματωθεί κατά περίπτωση. Αποτελεί μία πολύτιμη προσθήκη στην εργαλειοθήκη του WPF όπου, παραδόξως, δεν περιλαμβάνει η στάνταρ βιβλιοθήκη. Παρακάτω, παρατίθενται τα UpDownControls ανά τύπο δεδομένων. Για Αριθμητικά δεδομένα: ByteUpDown Επιτρέπει την είσοδο και αυξομείωση μόνο αριθμητικών δεδομένων, τύπου Byte. Η τιμή απαιτείται (required). ShortUpDown Επιτρέπει την είσοδο και αυξομείωση μόνο αριθμητικών δεδομένων, τύπου Short. Η τιμή απαιτείται (required). IntegerUpDown Επιτρέπει την είσοδο και αυξομείωση μόνο αριθμητικών δεδομένων, τύπου Integer. Η τιμή απαιτείται (required). Σελίδα 4
6 Zeus UpDownControls LongUpDown Επιτρέπει την είσοδο και αυξομείωση μόνο αριθμητικών δεδομένων, τύπου Long. Η τιμή απαιτείται (required). SingleUpDown Επιτρέπει την είσοδο και αυξομείωση μόνο αριθμητικών δεδομένων, τύπου Single. Η τιμή απαιτείται (required). DoubleUpDown Επιτρέπει την είσοδο και αυξομείωση μόνο αριθμητικών δεδομένων, τύπου Double. Η τιμή απαιτείται (required). DecimalUpDown Επιτρέπει την είσοδο και αυξομείωση μόνο αριθμητικών δεδομένων, τύπου Decimal. Η τιμή απαιτείται (required). Για Ημερομηνιακά δεδομένα: DatePickerUpDown Επιτρέπει την είσοδο και αυξομείωση μόνο ημερομηνιακών δεδομένων, τύπου Date ή DateTime. Η τιμή δεν απαιτείται (not required). Σελίδα 5
7 Zeus UpDownControls Οι ορισμοί των κλάσεων Οι κλάσεις έχουν οριστεί ως εξής: Για την βασική κλάση UpDownBase: Σύνταξη: Public Class UpDownBase Inherits Control Για την κλάση ByteUpDown: Σύνταξη: Public Class ByteUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:byteupdown... /> Για την κλάση ShortUpDown: Σύνταξη: Public Class ShortUpDown Inherits UpDownBase XAML Object Element Usage: Σελίδα 6
8 Zeus UpDownControls Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:shortupdown... /> Για την κλάση IntegerUpDown: Σύνταξη: Public Class IntegerUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:integerupdown... /> Για την κλάση LongUpDown: Σύνταξη: Public Class LongUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Σελίδα 7
9 Zeus UpDownControls Χρήση: <zeus:longupdown... /> Για την κλάση SingleUpDown: Σύνταξη: Public Class SingleUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:singleupdown... /> Για την κλάση DoubleUpDown: Σύνταξη: Public Class DoubleUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:doubleupdown... /> Σελίδα 8
10 Zeus UpDownControls Για την κλάση DecimalUpDown: Σύνταξη: Public Class DecimalUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:decimalupdown... /> Για την κλάση DatePickerUpDown: Σύνταξη: Public Class DatePickerUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:datepickerupdown... /> Σελίδα 9
11 Zeus UpDownControls Διανομή Κατά τη διανομή, στο φάκελο της εφαρμογής σας πρέπει να αντιγράψετε το assembly αρχείο Zeus UpDownControls.dll. Σελίδα 10
12 Zeus UpDownControls Επικοινωνία Για οποιαδήποτε πληροφορία ή διευκρίνηση παρακαλώ επικοινωνήστε στο : mouratx@yahoo.com ή mouratx@hotmail.com Χρήστος Μουρατίδης, Πειραιάς, Σεπτέμβριος 2018 Υ.Γ. Μπορείτε να επικοινωνήσετε μαζί μου για να προμηθευτείτε το βιβλίο μου "Μάθετε το WPF με τη Visual Basic" (1.333 σελίδες, Αυτοέκδοση 2018). Σελίδα 11
13 UpDownBase UpDownBase Η βασική κλάση όλων των UpDownControls. Ιδιότητες
14 UpDownBase Ιδιότητες Όνομα ButtonsWidth Περιγραφή Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του control. (Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control). ErrorMessageOnIncorrectValueType Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι του συγκεκριμένου τύπου (ανάλογα με την sub-class, π.χ. για το ByteUpDown να είναι Byte κλπ). ErrorMessageOnValueOutOfRange ErrorTemplate Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι στο αποδεκτό εύρος (Minimum-Maximum). Οι ιδιότητες Minimum, Maximum ορίζονται στις sub-classes. Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους. HasError Αν είναι True, τότε το control είναι σε κατάσταση λάθους. IsMinimum IsMaximum ValueFormat Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Minimum σε μία sub-class (π.χ. ByteUpDown). Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Maximum σε μία sub-class (π.χ. ByteUpDown). Καθορίζει το StringFormat της τιμής του control. Σελίδα 13
15 UpDownBase ButtonsWidth Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του UpDownControl. Σύνταξη: Public Property ButtonsWidth As Double Τύπος: System.Double Προσδιορίζουμε μία τιμή Double που θα καθορίζει το πλάτος του buttons αυξομείωσης του control. By default, η τιμή είναι 15. Παρατηρήσεις: Η ελάχιστη τιμή είναι 10. Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control. Dependency Property Information: Identifier field: ButtonsWidthProperty Παράδειγμα 1: Στο επόμενο παράδειγμα, καθορίζουμε το πλάτος στο UpDown1 σε 25 pixels. XAML: <zeus:byteupdown x:name="updown1" Minimum="1" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.ButtonsWidth = 25 Default Τιμή (ButtonsWidth=15) ButtonsWidth=25 Σελίδα 14
16 UpDownBase ErrorMessageOnIncorrectValueType Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι συγκεκριμένου τύπου (ανάλογα με την sub-class, π.χ. για ByteUpDown να είναι Byte κλπ). Σύνταξη: Public Property ErrorMessageOnIncorrectValueType As String Τύπος: System.String Προσδιορίζουμε μία τιμή String που θα αποτελεί το μήνυμα για λανθασμένη εισαγωγή τιμής. Dependency Property Information: Identifier field: ErrorMessageOnIncorrectValueTypeProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το μήνυμα "Please, enter a valid value!" να εμφανίζεται όταν ο χρήστης εισάγει μία τιμή που δεν είναι τύπου Byte. Έχουμε ορίσει, στο τμήμα Window.Resources ενός αντικειμένου Window, ένα ControlTemplate για τα σφάλματα κι ένα Style για τα UpDown controls. XAML <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x:name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> Σελίδα 15
17 UpDownBase </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <!-- The style base for the UpDown controls --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> </Window.Resources>... <zeus:byteupdown x:name="updown1" Minimum="1" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" Style="{StaticResource UpDownStyle}" /> Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate UpDown1.ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" Βλέπουμε το αποτέλεσμα, όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τον τύπο) τιμή: Σελίδα 16
18 UpDownBase ErrorMessageOnValueOutOfRange Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι μέσα στο αποδεκτό εύρος τιμών, όπως αυτό ορίζεται στις ιδιότητες Minimum και Maximum των sub-classes. Σύνταξη: Public Property ErrorMessageOnValueOutOfRange As String Τύπος: System.String Προσδιορίζουμε μία τιμή String που θα αποτελεί το μήνυμα για λανθασμένη εισαγωγή τιμής. Dependency Property Information: Identifier field: ErrorMessageOnValueOutOfRangeProperty Παρατηρήσεις: Για το DatePickerUpDown το αποδεκτό εύρος ημερομηνιών προσδιορίζεται μέσω των ιδιοτήτων DisplayDateStart και DisplayDateEnd. Για τα αριθμητικά UpDownControls το αποδεκτό εύρος προσδιορίζεται μέσω των ιδιοτήτων Minimum και Maximum. Παράδειγμα: Στο επόμενο παράδειγμα, το UpDown1 έχει αποδεκτό εύρος τιμών από 1 έως 20. Αν ο χρήστης εισάγει μία έγκυρη τιμή Byte αλλά έξω από τα όρια τότε εμφανίζεται το μήνυμα "The number must be between 1 and 20. Please, retry." Έχουμε ορίσει, στο τμήμα Window.Resources ενός αντικειμένου Window, ένα ControlTemplate για τα σφάλματα κι ένα Style για τα UpDown controls. XAML <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > Σελίδα 17
19 UpDownBase <AdornedElementPlaceholder x:name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <!-- The style base for the UpDown controls --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> </Window.Resources>... <zeus:byteupdown x:name="updown1" Minimum="1" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 20. Please, retry." Style="{StaticResource UpDownStyle}" /> Σελίδα 18
20 UpDownBase Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate UpDown1.ErrorMessageOnValueOutOfRange = "The number must be betweem 1 and 20. Please, retry." Βλέπουμε το αποτέλεσμα, όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή: Σελίδα 19
21 UpDownBase ErrorTemplate Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους (λανθασμένος τύπος τιμής ή η τιμή δεν είναι μέσα στο αποδεκτό εύρος Minimum-Maximum). Σύνταξη: Public Property ErrorTemplate As ControlTemplate Τύπος: System.Windows.Control.ControlTemplate Προσδιορίζουμε ένα αντικείμενο ControlTemplate που θα αποτελεί το template εμφάνισης για την κατάσταση λάθους. Dependency Property Information: Identifier field: ErrorTemplateProperty Παρατηρήσεις: Για το DatePickerUpDown το αποδεκτό εύρος ημερομηνιών προσδιορίζεται μέσω των ιδιοτήτων DisplayDateStart και DisplayDateEnd. Για τα αριθμητικά UpDownControls το αποδεκτό εύρος προσδιορίζεται μέσω των ιδιοτήτων Minimum και Maximum. Συνιστάται η εφαρμογή του ErrorTemplate να γίνεται στο συμβάν Loaded των root elements του προγράμματος (Window ή Page ή UserControl). Παράδειγμα: Στο επόμενο παράδειγμα, το UpDown1 έχει αποδεκτό εύρος τιμών από 1 έως 20. Αν ο χρήστης εισάγει μία έγκυρη τιμή Byte αλλά έξω από τα όρια τότε εμφανίζεται το μήνυμα "The number must be between 1 and 20. Please, retry." Έχουμε ορίσει, στο τμήμα Window.Resources ενός αντικειμένου Window, ένα ControlTemplate για τα σφάλματα κι ένα Style για τα UpDown controls. XAML <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> Σελίδα 20
22 UpDownBase <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x:name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <!-- The style base for the UpDown controls --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> </Window.Resources>... <zeus:byteupdown x:name="updown1" Minimum="1" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 20. Please, retry." Style="{StaticResource UpDownStyle}" /> Σελίδα 21
23 UpDownBase Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) End Sub Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Βλέπουμε το αποτέλεσμα, όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Εφαρμόζεται το αντικείμενο validationerrortemplate, το οποίο έχει οριστεί στο XAML κώδικα του παραθύρου (ως resource), στην ιδιότητα ErrorTemplate του UpDown1 στον Loaded event handler του παραθύρου. Σελίδα 22
24 UpDownBase HasError Αν είναι True, τότε το UpDown control είναι σε κατάσταση λάθους. Σύνταξη: Public ReadOnly Property HasError As Boolean Τύπος: System.Boolean Επιστρέφει True αν το UpDown control είναι σε κατάσταση λάθους. Dependency Property Information: Identifier field: HasErrorProperty Παράδειγμα: Πολύ χρήσιμο είναι να αξιοποιήσουμε την ιδιότητα HasError σε ένα Style Trigger ώστε να θέσουμε κάποιες ιδιότητες μορφοποίησης (π.χ. Foreground) στην περίπτωση που το UpDown control είναι σε κατάσταση λάθους. Στο παρακάτω παράδειγμα, ορίζουμε ένα style για τα UpDown controls όπου σε ένα Style Trigger ορίζουμε ότι αν η ιδιότητα HasError είναι True, το χρώμα να γίνει κόκκινο με κόκκινο περίγραμμα πάχους 2 pixels (Foreground σε Red, BorderBrush σε Red και BorderThickness σε 2). XAML <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x:name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> Σελίδα 23
25 UpDownBase </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <!-- The style base for the UpDown controls --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> </Window.Resources>... <zeus:byteupdown x:name="updown1" Minimum="1" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 20. Please, retry." Style="{StaticResource UpDownStyle}" /> Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) End Sub Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Σελίδα 24
26 UpDownBase Βλέπουμε το αποτέλεσμα, όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Πέρα από το ErrorTemplate, ενεργοποιείται και το Style Trigger όπου το χρώμα του αριθμού γίνεται κόκκινο, το περίγραμμα κόκκινο με πάχος 2 pixels. Σελίδα 25
27 UpDownBase IsMinimum Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως έχει προσδιοριστεί στην ιδιότητα Minimum σε μία sub-class (π.χ. ByteUpDown). Σύνταξη: Public ReadOnly Property IsMinimum As Boolean Τύπος: System.Boolean Επιστρέφει True αν η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως έχει προσδιοριστεί στην ιδιότητα Minimum σε μία sub-class (π.χ. ByteUpDown). Dependency Property Information: Identifier field: IsMinimumProperty Παράδειγμα: Πολύ χρήσιμο είναι να αξιοποιήσουμε την ιδιότητα IsMinimum σε ένα Style Trigger ώστε να θέσουμε κάποιες ιδιότητες μορφοποίησης (π.χ. Foreground) στην περίπτωση που η τρέχουσα τιμή στο UpDown control έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Minimum σε μία sub-class (π.χ. ByteUpDown). Στο παρακάτω παράδειγμα, ορίζουμε ένα style για τα UpDown controls όπου σε ένα Style Trigger ορίζουμε ότι αν η ιδιότητα IsMinimum είναι True, το χρώμα φόντου να γίνει πορτοκαλί και το χρώμα γραμματοσειράς να γίνει άσπρο (Background σε Orange και Foreground σε White). XAML <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x:name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" Σελίδα 26
28 UpDownBase VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <!-- The style base for the UpDown controls --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> </Window.Resources>... <zeus:byteupdown x:name="updown1" Minimum="1" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 20. Please, retry." Style="{StaticResource UpDownStyle}" /> Tο αποτέλεσμα όταν η τρέχουσα τιμή φτάσει στο ελάχιστο (επίσης, το down arrow button απενεργοποείται αυτόματα): Σελίδα 27
29 UpDownBase Παράδειγμα 2 : Εδώ, ορίζουμε δυναμικά το style, με όνομα style1 (στοχευμένο στον τύπο UpDownBase), ορίζοντας κάποιες ιδιότητες μορφοποίησης (FontSize, Background, HorizontalAlignment, Margin) και ένα style trigger για την ιδιότητα IsMinimum: 'Define the new style, targeting at the UpDownBase. Dim style1 As New Style With {.TargetType = GetType(UpDownBase)} With style1.setters.add(new Setter(FontSizeProperty, CDbl(16))).Add(New Setter(BackgroundProperty, Brushes.White)).Add(New Setter(HorizontalAlignmentProperty, HorizontalAlignment.Left)).Add(New Setter(MarginProperty, New Thickness(5, 0, 0, 0))) End With 'The style trigger for the isminimum property. Dim minimumstyletrigger As New Trigger With minimumstyletrigger 'Condition..Property = UpDownBase.IsMinimumProperty.Value = True 'Format setters..setters.add(new Setter(BackgroundProperty, Brushes.Brown)).Setters.Add(New Setter(ForegroundProperty, Brushes.Yellow)) End With 'Add the style trigger to the collection. style1.triggers.add(minimumstyletrigger) 'Set the UpDown1 style to the style1. UpDown1.Style = style1 Βλέπουμε το αποτέλεσμα: Σελίδα 28
30 UpDownBase IsMaximum Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως έχει προσδιοριστεί στην ιδιότητα Maximum σε μία sub-class (π.χ. ByteUpDown). Σύνταξη: Public ReadOnly Property IsMaximum As Boolean Τύπος: System.Boolean Επιστρέφει True αν η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως έχει προσδιοριστεί στην ιδιότητα Maximum σε μία sub-class (π.χ. ByteUpDown). Dependency Property Information: Identifier field: IsMaximumProperty Παράδειγμα: Πολύ χρήσιμο είναι να αξιοποιήσουμε την ιδιότητα IsMaximum σε ένα Style Trigger ώστε να θέσουμε κάποιες ιδιότητες μορφοποίησης (π.χ. Foreground) στην περίπτωση που η τρέχουσα τιμή στο UpDown control έχει φτάσει στο μέγιστο όριο, όπως έχει προσδιοριστεί στην ιδιότητα Maximum σε μία sub-class (π.χ. ByteUpDown). Στο παρακάτω παράδειγμα, ορίζουμε ένα style για τα UpDown controls όπου σε ένα Style Trigger ορίζουμε ότι αν η ιδιότητα IsMaximum είναι True, το χρώμα φόντου να γίνει πράσινο και το χρώμα γραμματοσειράς να γίνει άσπρο (Background σε Green και Foreground σε White). XAML <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x:name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" Σελίδα 29
31 UpDownBase VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <!-- The style base for the UpDown controls --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> </Window.Resources>... <zeus:byteupdown x:name="updown1" Minimum="1" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 20. Please, retry." Style="{StaticResource UpDownStyle}" /> Tο αποτέλεσμα όταν η τρέχουσα τιμή φτάσει στο μέγιστο (επίσης, το up arrow button απενεργοποείται αυτόματα): Σελίδα 30
32 UpDownBase Παράδειγμα 2 : Εδώ, ορίζουμε δυναμικά το style, με όνομα style2 (στοχευμένο στον τύπο UpDownBase), ορίζοντας κάποιες ιδιότητες μορφοποίησης (FontSize, Background, HorizontalAlignment, Margin) και ένα style trigger για την ιδιότητα IsMaximum: 'Define the new style, targeting at the UpDownBase. Dim style2 As New Style With {.TargetType = GetType(UpDownBase)} With style2.setters.add(new Setter(FontSizeProperty, CDbl(16))).Add(New Setter(BackgroundProperty, Brushes.White)).Add(New Setter(HorizontalAlignmentProperty, HorizontalAlignment.Left)).Add(New Setter(MarginProperty, New Thickness(5, 0, 0, 0))) End With 'The style trigger for the ismaximum property. Dim maximumstyletrigger As New Trigger With maximumstyletrigger 'Condition..Property = UpDownBase.IsMaximumProperty.Value = True 'Format setters..setters.add(new Setter(BackgroundProperty, Brushes.BlueViolet)).Setters.Add(New Setter(ForegroundProperty, Brushes.Yellow)).Setters.Add(New Setter(FontSizeProperty, CDbl(18))) End With 'Add the style trigger to the collection. style2.triggers.add(maximumstyletrigger ) 'Set the UpDown1 style to the style2. UpDown1.Style = style2 Βλέπουμε το αποτέλεσμα: Σελίδα 31
33 UpDownBase ValueFormat Καθορίζει το StringFormat της τιμής του control. Σύνταξη: Public Property ValueFormat As String Τύπος: System.String Προσδιορίζουμε ένα string για την εμφάνιση της τιμής του control. Dependency Property Information: Identifier field: ValueFormatProperty Παρατηρήσεις: Το string μορφοποίησης της τιμής (αριθμού ή ημερομηνίας) ακολουθεί τους κανόνες που ισχύουν στην ιδιότητα StringFormat της κλάσης BindingBase. Συμβουλευθείτε το Help του Visual Studio για λεπτομέρειες. Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε η μορφή εμφάνισης της τιμής του UpDown1 να είναι "C0", δηλαδή νομισματική με 0 δεκαδικά. Προσέχουμε να ορίσουμε σωστά την ιδιότητα Language, αν αυτό είναι απαραίτητο. XAML <zeus:byteupdown x:name="updown1" Minimum="1" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="C0" Language="el" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The amount must be between 1 and 20. Please, retry." Style="{StaticResource UpDownStyle }" /> UpDown1.ValueFormat = "C0" Σελίδα 32
34 UpDownBase Βλέπουμε το αποτέλεσμα: Σελίδα 33
35 UpDownControls για Αριθμητικούς τύπους Αριθμητικοί τύποι Στα επόμενα, παρουσιάζονται τα UpDownControls για τους βασικούς αριθμητικούς τύπους (Byte, Short, Integer, Long, Single, Double και Decimal). ByteUpDown ShortUpDown IntegerUpDown LongUpDown SingleUpDown DoubleUpDown DecimalUpDown
36 ByteUpDown ByteUpDown Ένα UpDown control που επιτρέπει την είσοδο μόνο αριθμητικών δεδομένων, τύπου Byte. Η τιμή απαιτείται (required). Σύνταξη: <TemplateVisualState(Name:="Normal", GroupName:="CommonStates"), TemplateVisualState(Name:="MouseOver", GroupName:="CommonStates"), TemplateVisualState(Name:="Disabled", GroupName:="CommonStates"), TemplateVisualState(Name:="Focused", GroupName:="FocusStates"), TemplateVisualState(Name:="Unfocused", GroupName:="FocusStates"), TemplatePart(Name:="PART_Value", Type:=GetType(TextBox)), TemplatePart(Name:="PART_IncrementUp", Type:=GetType(RepeatButton)), TemplatePart(Name:="PART_IncrementDown", Type:=GetType(RepeatButton))> <DefaultProperty("Value")> Public Class ByteUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:byteupdown... /> Παράδειγμα: Στο παράδειγμα που ακολουθεί, τοποθετούμε ένα ByteUpDown μέσα σε ένα Grid ενός παραθύρου. Συνδέουμε την ιδιότητα Value με την ιδιότητα Amount1, τύπου Byte, ενός Customer αντικειμένου (source object). H κλάση Customer ορίζεται στο project και συνεπώς πρέπει να εισάγουμε και το αντίστοιχο namespace με alias p. Επίσης, ορίζουμε ένα ErrorTemplate για το Validation (όπου μέσω αυτού θα εμφανιστεί το μήνυμα λάθους που ορίζουμε στην ιδιότητα ErrorMessageOnIncorrectValueType ή στην ιδιότητα ErrorMessageOnValueOutOfRange ). Επιπλέον, ορίζουμε ένα Style, στοχευμένο στην κλάση UpDownBase, για την ομοιόμορφη εμφάνιση των UpDown controls στο παράθυρο. <Window x:class="mainwindow" xmlns="
37 ByteUpDown xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> Σελίδα 36
38 ByteUpDown <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Byte):" /> <zeus:byteupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="20" Increment="1" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 20. Please, retry." Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Για την κλάση Customer δείτε το Παράρτημα 1. Μία κανονική κατάσταση του ByteUpDown : Σελίδα 37
39 ByteUpDown Παρακάτω, βλέπουμε την ένδειξη λάθους όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Αν πάει το δείκτη του ποντικιού πάνω στο θαυμαστικό θα εμφανιστεί το μήνυμα λάθους "The number must be between 1 and 20. Please, retry." Σελίδα 38
40 ByteUpDown Ιδιότητες Όνομα ButtonsWidth Περιγραφή Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του control. (Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control). (Κληρονομείται από την UpDownBase). ErrorMessageOnIncorrectValueType Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι τύπου Short. (Κληρονομείται από την UpDownBase). ErrorMessageOnValueOutOfRange ErrorTemplate HasError Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι στο αποδεκτό εύρος (Minimum-Maximum). (Κληρονομείται από την UpDownBase). Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Byte. H default τιμή είναι 1. IsMinimum IsMaximum Minimum Maximum Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Minimum. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Maximum. (Κληρονομείται από την UpDownBase). Καθορίζει το ελάχιστο όριο στο control, τύπου Byte. H default τιμή είναι Byte.MinValue. Καθορίζει το μέγιστο όριο στο control, τύπου Byte. H default τιμή είναι Byte.MaxValue. Σελίδα 39
41 ByteUpDown Value ValueFormat Η τρέχουσα τιμή στο control, τύπου Byte. H default τιμή είναι 0. Καθορίζει το StringFormat της τιμής του control. (Κληρονομείται από την UpDownBase). Σελίδα 40
42 ByteUpDown Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Byte. Σύνταξη: Public Property Increment As Byte Τύπος: System.Byte Προσδιορίζουμε μία θετική τιμή για το βήμα αύξησης της τιμής. H default τιμή είναι 1. Dependency Property Information: Identifier field: IncrementProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το βήμα αύξησης στο UpDown1 σε 2. XAML: <zeus:byteupdown x:name="updown1" Minimum="1" Maximum="20" Increment="2" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Increment = 2 Σελίδα 41
43 ByteUpDown Minimum Καθορίζει το ελάχιστο όριο στο control, τύπου Byte. Σύνταξη: Public Property Minimum As Byte Τύπος: System.Byte Προσδιορίζουμε μία τιμή, ως το ελάχιστο αποδεκτό όριο. H default τιμή είναι Byte.MinValue. Dependency Property Information: Identifier field: MinimumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το ελάχιστο όριο στο UpDown1 σε 10. XAML: <zeus:byteupdown x:name="updown1" Minimum="10" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Minimum = 10 Σελίδα 42
44 ByteUpDown Maximum Καθορίζει το μέγιστο όριο στο control, τύπου Byte. Σύνταξη: Public Property Maximum As Byte Τύπος: System.Byte Προσδιορίζουμε μία τιμή, ως το μέγιστο αποδεκτό όριο. H default τιμή είναι Byte.MaxValue. Dependency Property Information: Identifier field: MaximumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το μέγιστο όριο στο UpDown1 σε 50. XAML: <zeus:byteupdown x:name="updown1" Minimum="10" Maximum="50" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Maximum = 50 Σελίδα 43
45 ByteUpDown Value Η τρέχουσα τιμή στο control, τύπου Byte. Σύνταξη: Public Property Value As Byte Τύπος: System.Byte Η τρέχουσα τιμή. H default τιμή είναι 0. Dependency Property Information: Identifier field: ValueProperty Παρατηρήσεις: Σε μία WPF εφαρμογή, η λογική χρήση της ιδιότητας αυτής είναι μέσω μίας Binding έκφρασης. Με αυτόν τον τρόπο, η τρέχουσα τιμή συνδέεται με μία source πηγή (π.χ. μία public ιδιότητα ενός data object). Η τιμή προέρχεται από το source object και οποιαδήποτε μεταβολή της επιστρέφει στο source object (σε ένα two-way mode, που είναι και το default). Συμπερασματικά, συνιστάται η χρήση της με Binding έφραση. Παράδειγμα: Στο επόμενο παράδειγμα, η τιμή της ιδιότητας Value στο UpDown1 συνδέεται, μέσω Binding έκφρασης, με την ιδιότητα Amount1 του source object. Το τελευταίο (ένα αντικείμενο Customer) τίθεται ως πηγή δεδομένων στην ιδιότητα DataContext σε ένα container, που εδώ είναι το Grid panel. Οι τιμές των ιδιοτήτων του αντικειμένου Customer τίθενται στο τμήμα Window.Resources, αλλά θα μπορούσαν να τεθούν και στο VB κώδικα, σε κάποιον event handler. <Window x:class="mainwindow" xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> Σελίδα 44
46 ByteUpDown <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Σελίδα 45
47 ByteUpDown Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Byte):" /> <zeus:byteupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="20" Increment="1" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 20. Please, retry." Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) End Sub Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Βλέπουμε την αρχική κατάσταση του UpDown1. Η τιμή 12 προέρχεται από την ιδιότητα Amount1 του αντικειμένου Customer: Αν ο χρήστης φτάσει στη μέγιστη τιμή (20) τότε, λόγω του style trigger, το ByteUpDown μορφοποιείται ως εξής: Παράλληλα, απενεργοποείται και το up arrow button. Αν ο χρήστης, πληκτρολογήσει απ' ευθείας μία τιμή εκτός ορίων, τότε το control εισέρχεται σε κατάσταση λάθους: Σελίδα 46
48 ByteUpDown Επίσης, αν ο χρήστης, πληκτρολογήσει μία τιμή λανθασμένου τύπου, τότε το control πάλι εισέρχεται σε κατάσταση λάθους: Σελίδα 47
49 ByteUpDown Συμβάντα Όνομα MinimumChanged Περιγραφή Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σελίδα 48
50 ByteUpDown MinimumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. Σύνταξη: VB (ορισμός): Public Custom Event MinimumChanged As RoutedPropertyChangedEventHandler(Of Byte) XAML attribute usage: <zeus:byteupdown MinimumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MinimumChanged του UpDown1: XAML: <zeus:byteupdown x:name="updown1" Minimum="0" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" MinimumChanged="UpDown1_MinimumChanged"... /> Private Sub UpDown1_MinimumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Byte)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new minimum value is {0}", e.newvalue)) Σελίδα 49
51 ByteUpDown MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. Σύνταξη: VB (ορισμός): Public Custom Event MaximumChanged As RoutedPropertyChangedEventHandler(Of Byte) XAML attribute usage: <zeus:byteupdown MaximumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MaximumChanged του UpDown1: XAML: <zeus:byteupdown x:name="updown1" Minimum="0" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" MaximumChanged="UpDown1_MaximumChanged"... /> Private Sub UpDown1_MaximumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Byte)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new maximum value is {0}", e.newvalue)) Σελίδα 50
52 ByteUpDown ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σύνταξη: VB (ορισμός): Public Custom Event ValueChanged As RoutedPropertyChangedEventHandler(Of Byte) XAML attribute usage: <zeus:byteupdown ValueChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν ValueChanged του UpDown1: XAML: <zeus:byteupdown x:name="updown1" Minimum="0" Maximum="20" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged"... /> Private Sub UpDown1_ValueChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Byte)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The current value is {0}", e.newvalue)) Σελίδα 51
53 ByteUpDown Styles και Templates Parts και States To default Style και ControlTemplate Παράδειγμα custom Style και ControlTemplate Σελίδα 52
54 ByteUpDown Parts και States Το default ControlTemplate περιλαμβάνει κάποια part names και visual states. Μπορείτε να τροποποιήσετε το default ControlTemplate ώστε να δώσετε στο control μία μοναδική εμφάνιση. Το default ControlTemplate μπορείτε να το δείτε εδώ ώστε να πάρετε μία ιδέα και με βάση αυτό να δημιουργήσετε ένα δικό σας. Ένα παράδειγμα custom ControlTemplate μπορείτε να δείτε εδώ. Ο παρακάτω πίνακας εμφανίζει τα part names του ByteUpDown control: Part Τύπος Περιγραφή PART_Value TextBox Το standard TextBox control. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την αύξηση της τιμής. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την μείωση της τιμής. Ο παρακάτω πίνακας εμφανίζει τα visual states του ByteUpDown control: VisualState VisualStateGroup Περιγραφή Normal CommonStates To default state. MouseOver CommonStates Το state όταν ο δείκτης του ποντικιού είναι πάνω από το control. Disabled CommonStates Το state όταν το control είναι disabled. Focused FocusStates Το state όταν το control έχει το focus. Unfocused FocusStates Το state όταν το control δεν έχει το focus. Το default ControlTemplate έχει καθορισμένο μόνο το Disabled state. Μπορείτε να δημιουργήσετε ένα custom ControlTemplate για να το αλλάξετε ή/και για να καθορίσετε τα υπόλοιπα. Σελίδα 53
55 ByteUpDown To default Style και ControlTemplate Ο XAML κώδικας για το default Style και ControlTemplate φαίνεται παρακάτω. Μπορείτε να βασιστείτε σε αυτόν για να δημιουργήσετε μία μικρή ή μεγάλη παραλλαγή του δικού σας custom Style και ControlTemplate: xmlns:z="clr-namespace:zeus.wpf.controls.updowncontrols"> <Style TargetType="{x:Type z:byteupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type z:byteupdown}"> <ControlTemplate.Resources > <z:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard > <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Σελίδα 54
56 ByteUpDown Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" /> <VisualState Name="Unfocused"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" > <Grid.RowDefinitions > <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- The width of the second Grid column is about for the RepeatButtons and depends on ButtonsWidth property --> <Grid.ColumnDefinitions > <ColumnDefinition Width="*" /> <ColumnDefinition Width="{Binding RelativeSource={Relative Source Mode=FindAncestor, AncestorType={x:Type z:byteupdown}}, Path=ButtonsWidth, Converter={StaticResource doubletogridlengthconverter}}" /> </Grid.ColumnDefinitions> <TextBox Name="PART_Value" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> <Viewbox Stretch="Fill" Grid.Column="1"> <StackPanel Name="stkRepeatButtons" VerticalAlignment="Center" HorizontalAlignment="Left" Focusable="False"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> Σελίδα 55
57 ByteUpDown </Style> </Grid> </Border> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </StackPanel> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Η δεύτερη στήλη του Grid περιέχει τα repeat buttons μέσα σε ένα StackPanel. To πλάτος της δεύτερης στήλης του Grid προσδιορίζεται με βάση την τιμή της ιδιότητας ButtonsWidth. Για να μετατραπεί η τιμή Double της ιδιότητας ButtonsWidth σε τιμή τύπου GridLength χρησιμοποιούμε μία κλάση μετατροπής τιμής (ValueConverter). Θα τη βρείτε στο Παράρτημα 2. Σελίδα 56
58 ByteUpDown Παράδειγμα custom Style και ControlTemplate Στο επόμενο παράδειγμα, δημιουργούμε ένα custom Style και ControlTemplate. Συγκεκριμένα: Ορίζουμε ότι όταν λάβει την εστίαση, το background να γίνει κίτρινο. Αυτό γίνεται, θέτοντας στο Focused state το σχετικό Storyboard που περιέχει ένα ColorAnimation που κάνει animate το background color σε Yellow σε χρόνο 0.2 sec. Στη δομή του ControlTemplate, αλλάζουμε θέση στα up-down buttons. Το up-button βρίσκεται πάνω δεξιά από το TextBox ενώ το down-button βρίσκεται από κάτω δεξιά (3 γραμμές). Για να επιτευχθεί αυτό αλλάζει λίγο η διάταξη του Grid container, που τώρα περιέχει 3 RowDefinintions. Η λειτουργικότητα του control παραμένει η ίδια. Η εικόνα του custom ByteUpDown σε κανονική κατάσταση - Normal state: Η εικόνα του custom ByteUpDown όταν έχει την εστίαση - Focused state: Ο XAML κώδικας για το custom Style και ControlTemplate του παραπάνω ByteUpDown είναι ο εξής: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncont rols" <Style TargetType="{x:Type zeus:byteupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type zeus:byteupdown}"> <ControlTemplate.Resources > <zeus:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> Σελίδα 57
59 ByteUpDown <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" > <Storyboard > ColorAnimation Storyboard.TargetName="PART_Value" Storyboard.TargetProperty="Background.Color" To="Yellow" Duration="0:0:0.2"/> </Storyboard> </VisualState> <VisualState Name="Unfocused"/> </VisualStateGroup> Σελίδα 58
60 ByteUpDown </Style> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" Margin="{TemplateBinding Padding}"> <Grid.RowDefinitions > <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBox Name="PART_Value" Grid.Row="1" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> </Grid> </Border> <Viewbox Stretch="Uniform" Grid.Row="0" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> <Viewbox Stretch="Uniform" Grid.Row="2" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Σελίδα 59
61 ShortUpDown ShortUpDown Ένα UpDown control που επιτρέπει την είσοδο μόνο αριθμητικών δεδομένων, τύπου Short. Η τιμή απαιτείται (required). Σύνταξη: <TemplateVisualState(Name:="Normal", GroupName:="CommonStates"), TemplateVisualState(Name:="MouseOver", GroupName:="CommonStates"), TemplateVisualState(Name:="Disabled", GroupName:="CommonStates"), TemplateVisualState(Name:="Focused", GroupName:="FocusStates"), TemplateVisualState(Name:="Unfocused", GroupName:="FocusStates"), TemplatePart(Name:="PART_Value", Type:=GetType(TextBox)), TemplatePart(Name:="PART_IncrementUp", Type:=GetType(RepeatButton)), TemplatePart(Name:="PART_IncrementDown", Type:=GetType(RepeatButton))> <DefaultProperty("Value")> Public Class ShortUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:shortupdown... /> Παράδειγμα: Στο παράδειγμα που ακολουθεί, τοποθετούμε ένα ShortUpDown μέσα σε ένα Grid ενός παραθύρου. Συνδέουμε την ιδιότητα Value με την ιδιότητα Amount1, τύπου Short, ενός Customer αντικειμένου (source object). H κλάση Customer ορίζεται στο project και συνεπώς πρέπει να εισάγουμε και το αντίστοιχο namespace με alias p. Επίσης, ορίζουμε ένα ErrorTemplate για το Validation (όπου μέσω αυτού θα εμφανιστεί το μήνυμα λάθους που ορίζουμε στην ιδιότητα ErrorMessageOnIncorrectValueType ή στην ιδιότητα ErrorMessageOnValueOutOfRange ). Επιπλέον, ορίζουμε ένα Style, στοχευμένο στην κλάση UpDownBase, για την ομοιόμορφη εμφάνιση των UpDown controls στο παράθυρο. <Window x:class="mainwindow"
62 ShortUpDown xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> Σελίδα 61
63 ShortUpDown <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Short):" /> <zeus:shortupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="800" Increment="1" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 800. Please, retry." Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Για την κλάση Customer δείτε το Παράρτημα 1 Μία κανονική κατάσταση του ShortUpDown : Σελίδα 62
64 ShortUpDown Παρακάτω, βλέπουμε την ένδειξη λάθους όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Αν πάει το δείκτη του ποντικιού πάνω στο θαυμαστικό θα εμφανιστεί το μήνυμα λάθους "The number must be between 1 and 800. Please, retry." Σελίδα 63
65 ShortUpDown Ιδιότητες Όνομα ButtonsWidth Περιγραφή Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του control. (Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control). (Κληρονομείται από την UpDownBase). ErrorMessageOnIncorrectValueType Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι τύπου Short. (Κληρονομείται από την UpDownBase). ErrorMessageOnValueOutOfRange ErrorTemplate HasError Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι στο αποδεκτό εύρος (Minimum-Maximum). (Κληρονομείται από την UpDownBase). Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Short. H default τιμή είναι 1. IsMinimum IsMaximum Minimum Maximum Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Minimum. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Maximum. (Κληρονομείται από την UpDownBase). Καθορίζει το ελάχιστο όριο στο control, τύπου Short. H default τιμή είναι Short.MinValue. Καθορίζει το μέγιστο όριο στο control, τύπου Short. H default τιμή είναι Short.MaxValue. Σελίδα 64
66 ShortUpDown Value ValueFormat Η τρέχουσα τιμή στο control, τύπου Short. H default τιμή είναι 0. Καθορίζει το StringFormat της τιμής του control. (Κληρονομείται από την UpDownBase). Σελίδα 65
67 ShortUpDown Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Short. Σύνταξη: Public Property Increment As Short Τύπος: System.Short Προσδιορίζουμε μία θετική τιμή για το βήμα αύξησης της τιμής. H default τιμή είναι 1. Dependency Property Information: Identifier field: IncrementProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το βήμα αύξησης στο UpDown1 σε 2. XAML: <zeus:shortupdown x:name="updown1" Minimum="1" Maximum="800" Increment="2" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Increment = 2 Σελίδα 66
68 ShortUpDown Minimum Καθορίζει το ελάχιστο όριο στο control, τύπου Short. Σύνταξη: Public Property Minimum As Short Τύπος: System.Short Προσδιορίζουμε μία τιμή, ως το ελάχιστο αποδεκτό όριο. H default τιμή είναι Short.MinValue. Dependency Property Information: Identifier field: MinimumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το ελάχιστο όριο στο UpDown1 σε 10. XAML: <zeus:shortupdown x:name="updown1" Minimum="10" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Minimum = 10 Σελίδα 67
69 ShortUpDown Maximum Καθορίζει το μέγιστο όριο στο control, τύπου Short. Σύνταξη: Public Property Maximum As Short Τύπος: System.Short Προσδιορίζουμε μία τιμή, ως το μέγιστο αποδεκτό όριο. H default τιμή είναι Short.MaxValue. Dependency Property Information: Identifier field: MaximumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το μέγιστο όριο στο UpDown1 σε 900. XAML: <zeus:shortupdown x:name="updown1" Minimum="10" Maximum="900" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Maximum = 900 Σελίδα 68
70 ShortUpDown Value Η τρέχουσα τιμή στο control, τύπου Short. Σύνταξη: Public Property Value As Short Τύπος: System.Short Η τρέχουσα τιμή. H default τιμή είναι 0. Dependency Property Information: Identifier field: ValueProperty Παρατηρήσεις: Σε μία WPF εφαρμογή, η λογική χρήση της ιδιότητας αυτής είναι μέσω μίας Binding έκφρασης. Με αυτόν τον τρόπο, η τρέχουσα τιμή συνδέεται με μία source πηγή (π.χ. μία public ιδιότητα ενός data object). Η τιμή προέρχεται από το source object και οποιαδήποτε μεταβολή της επιστρέφει στο source object (σε ένα two-way mode, που είναι και το default). Συμπερασματικά, συνιστάται η χρήση της με Binding έφραση. Παράδειγμα: Στο επόμενο παράδειγμα, η τιμή της ιδιότητας Value στο UpDown1 συνδέεται, μέσω Binding έκφρασης, με την ιδιότητα Amount1 του source object. Το τελευταίο (ένα αντικείμενο Customer) τίθεται ως πηγή δεδομένων στην ιδιότητα DataContext σε ένα container, που εδώ είναι το Grid panel. Οι τιμές των ιδιοτήτων του αντικειμένου Customer τίθενται στο τμήμα Window.Resources, αλλά θα μπορούσαν να τεθούν και στο VB κώδικα, σε κάποιον event handler. <Window x:class="mainwindow" xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> Σελίδα 69
71 ShortUpDown <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Σελίδα 70
72 ShortUpDown Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Short):" /> <zeus:shortupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="800" Increment="1" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 800. Please, retry." Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) End Sub Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Βλέπουμε την αρχική κατάσταση του UpDown1. Η τιμή 12 προέρχεται από την ιδιότητα Amount1 του αντικειμένου Customer: Αν ο χρήστης φτάσει στη μέγιστη τιμή (800) τότε, λόγω του style trigger, το ShortUpDown μορφοποιείται ως εξής: Παράλληλα, απενεργοποείται και το up arrow button. Αν ο χρήστης, πληκτρολογήσει απ' ευθείας Σελίδα 71
73 ShortUpDown μία τιμή εκτός ορίων, τότε το control εισέρχεται σε κατάσταση λάθους: Επίσης, αν ο χρήστης, πληκτρολογήσει μία τιμή λανθασμένου τύπου, τότε το control πάλι εισέρχεται σε κατάσταση λάθους: Σελίδα 72
74 ShortUpDown Συμβάντα Όνομα MinimumChanged Περιγραφή Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σελίδα 73
75 ShortUpDown MinimumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. Σύνταξη: VB (ορισμός): Public Custom Event MinimumChanged As RoutedPropertyChangedEventHandler(Of Short) XAML attribute usage: <zeus:shortupdown MinimumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MinimumChanged του UpDown1: XAML: <zeus:shortupdown x:name="updown1" Minimum="0" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" MinimumChanged="UpDown1_MinimumChanged"... /> Private Sub UpDown1_MinimumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Short)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new minimum value is {0}", e.newvalue)) Σελίδα 74
76 ShortUpDown MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. Σύνταξη: VB (ορισμός): Public Custom Event MaximumChanged As RoutedPropertyChangedEventHandler(Of Short) XAML attribute usage: <zeus:shortupdown MaximumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MaximumChanged του UpDown1: XAML: <zeus:shortupdown x:name="updown1" Minimum="0" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" MaximumChanged="UpDown1_MaximumChanged"... /> Private Sub UpDown1_MaximumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Short)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new maximum value is {0}", e.newvalue)) Σελίδα 75
77 ShortUpDown ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σύνταξη: VB (ορισμός): Public Custom Event ValueChanged As RoutedPropertyChangedEventHandler(Of Short) XAML attribute usage: <zeus:shortupdown ValueChanged ="eventhanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν ValueChanged του UpDown1: XAML: <zeus:shortupdown x:name="updown1" Minimum="0" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged"... /> Private Sub UpDown1_ValueChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Short)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The current value is {0}", e.newvalue)) Σελίδα 76
78 ShortUpDown Styles και Templates Parts και States To default Style και ControlTemplate Παράδειγμα custom Style και ControlTemplate Σελίδα 77
79 ShortUpDown Parts και States Το default ControlTemplate περιλαμβάνει κάποια part names και visual states. Μπορείτε να τροποποιήσετε το default ControlTemplate ώστε να δώσετε στο control μία μοναδική εμφάνιση. Το default ControlTemplate μπορείτε να το δείτε εδώ ώστε να πάρετε μία ιδέα και με βάση αυτό να δημιουργήσετε ένα δικό σας. Ένα παράδειγμα custom ControlTemplate μπορείτε να δείτε εδώ. Ο παρακάτω πίνακας εμφανίζει τα part names του ShortUpDown control: Part Τύπος Περιγραφή PART_Value TextBox Το standard TextBox control. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την αύξηση της τιμής. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την μείωση της τιμής. Ο παρακάτω πίνακας εμφανίζει τα visual states του ShortUpDown control: VisualState VisualStateGroup Περιγραφή Normal CommonStates To default state. MouseOver CommonStates Το state όταν ο δείκτης του ποντικιού είναι πάνω από το control. Disabled CommonStates Το state όταν το control είναι disabled. Focused FocusStates Το state όταν το control έχει το focus. Unfocused FocusStates Το state όταν το control δεν έχει το focus. Το default ControlTemplate έχει καθορισμένο μόνο το Disabled state. Μπορείτε να δημιουργήσετε ένα custom ControlTemplate για να το αλλάξετε ή/και για να καθορίσετε τα υπόλοιπα. Σελίδα 78
80 ShortUpDown To default Style και ControlTemplate Ο XAML κώδικας για το default Style και ControlTemplate φαίνεται παρακάτω. Μπορείτε να βασιστείτε σε αυτόν για να δημιουργήσετε μία μικρή ή μεγάλη παραλλαγή του δικού σας custom Style και ControlTemplate: xmlns:z="clr-namespace:zeus.wpf.controls.updowncontrols"> <Style TargetType="{x:Type z:shortupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type z:shortupdown}"> <ControlTemplate.Resources > <z:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard > <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Σελίδα 79
81 ShortUpDown Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" /> <VisualState Name="Unfocused"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" > <Grid.RowDefinitions > <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- The width of the second Grid column is about for the RepeatButtons and depends on ButtonsWidth property --> <Grid.ColumnDefinitions > <ColumnDefinition Width="*" /> <ColumnDefinition Width="{Binding RelativeSource={Relative Source Mode=FindAncestor, AncestorType={x:Type z:shortupdown}}, Path=ButtonsWidth, Converter={StaticResource doubletogridlengthconverter}}" /> </Grid.ColumnDefinitions> <TextBox Name="PART_Value" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> <Viewbox Stretch="Fill" Grid.Column="1"> <StackPanel Name="stkRepeatButtons" VerticalAlignment="Center" HorizontalAlignment="Left" Focusable="False"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> Σελίδα 80
82 ShortUpDown </Style> </Grid> </Border> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </StackPanel> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Η δεύτερη στήλη του Grid περιέχει τα repeat buttons μέσα σε ένα StackPanel. To πλάτος της δεύτερης στήλης του Grid προσδιορίζεται με βάση την τιμή της ιδιότητας ButtonsWidth. Για να μετατραπεί η τιμή Double της ιδιότητας ButtonsWidth σε τιμή τύπου GridLength χρησιμοποιούμε μία κλάση μετατροπής τιμής (ValueConverter). Θα τη βρείτε στο Παράρτημα 2. Σελίδα 81
83 ShortUpDown Παράδειγμα custom Style και ControlTemplate Στο επόμενο παράδειγμα, δημιουργούμε ένα custom Style και ControlTemplate. Συγκεκριμένα: Ορίζουμε ότι όταν λάβει την εστίαση, το background να γίνει κίτρινο. Αυτό γίνεται, θέτοντας στο Focused state το σχετικό Storyboard που περιέχει ένα ColorAnimation που κάνει animate το background color σε Yellow σε χρόνο 0.2 sec. Στη δομή του ControlTemplate, αλλάζουμε θέση στα up-down buttons. Το up-button βρίσκεται πάνω δεξιά από το TextBox ενώ το down-button βρίσκεται από κάτω δεξιά (3 γραμμές). Για να επιτευχθεί αυτό αλλάζει λίγο η διάταξη του Grid container, που τώρα περιέχει 3 RowDefinintions. Η λειτουργικότητα του control παραμένει η ίδια. Η εικόνα του custom ShortUpDown σε κανονική κατάσταση - Normal state: Η εικόνα του custom ShortUpDown όταν έχει την εστίαση - Focused state: Ο XAML κώδικας για το custom Style και ControlTemplate του παραπάνω ShortUpDown είναι ο εξής: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncont rols" <Style TargetType="{x:Type zeus:shortupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type zeus:shortupdown}"> <ControlTemplate.Resources > <zeus:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> Σελίδα 82
84 ShortUpDown <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" > <Storyboard > ColorAnimation Storyboard.TargetName="PART_Value" Storyboard.TargetProperty="Background.Color" To="Yellow" Duration="0:0:0.2"/> </Storyboard> </VisualState> <VisualState Name="Unfocused"/> </VisualStateGroup> Σελίδα 83
85 ShortUpDown </Style> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" Margin="{TemplateBinding Padding}"> <Grid.RowDefinitions > <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBox Name="PART_Value" Grid.Row="1" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> </Grid> </Border> <Viewbox Stretch="Uniform" Grid.Row="0" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> <Viewbox Stretch="Uniform" Grid.Row="2" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Σελίδα 84
86 IntegerUpDown IntegerUpDown Ένα UpDown control που επιτρέπει την είσοδο μόνο αριθμητικών δεδομένων, τύπου Integer. Η τιμή απαιτείται (required). Σύνταξη: <TemplateVisualState(Name:="Normal", GroupName:="CommonStates"), TemplateVisualState(Name:="MouseOver", GroupName:="CommonStates"), TemplateVisualState(Name:="Disabled", GroupName:="CommonStates"), TemplateVisualState(Name:="Focused", GroupName:="FocusStates"), TemplateVisualState(Name:="Unfocused", GroupName:="FocusStates"), TemplatePart(Name:="PART_Value", Type:=GetType(TextBox)), TemplatePart(Name:="PART_IncrementUp", Type:=GetType(RepeatButton)), TemplatePart(Name:="PART_IncrementDown", Type:=GetType(RepeatButton))> <DefaultProperty("Value")> Public Class IntegerUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:integerupdown... /> Παράδειγμα: Στο παράδειγμα που ακολουθεί, τοποθετούμε ένα IntegerDown μέσα σε ένα Grid ενός παραθύρου. Συνδέουμε την ιδιότητα Value με την ιδιότητα Amount1, τύπου Integer, ενός Customer αντικειμένου (source object). H κλάση Customer ορίζεται στο project και συνεπώς πρέπει να εισάγουμε και το αντίστοιχο namespace με alias p. Επίσης, ορίζουμε ένα ErrorTemplate για το Validation (όπου μέσω αυτού θα εμφανιστεί το μήνυμα λάθους που ορίζουμε στην ιδιότητα ErrorMessageOnIncorrectValueType ή στην ιδιότητα ErrorMessageOnValueOutOfRange ). Επιπλέον, ορίζουμε ένα Style, στοχευμένο στην κλάση UpDownBase, για την ομοιόμορφη εμφάνιση των UpDown controls στο παράθυρο. <Window x:class="mainwindow" xmlns="
87 IntegerUpDown xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> Σελίδα 86
88 IntegerUpDown <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Integer):" /> <zeus:integerupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="800" Increment="1" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 800. Please, retry." Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Για την κλάση Customer δείτε το Παράρτημα 1 Μία κανονική κατάσταση του IntegerUpDown : Σελίδα 87
89 IntegerUpDown Παρακάτω, βλέπουμε την ένδειξη λάθους όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Αν πάει το δείκτη του ποντικιού πάνω στο θαυμαστικό θα εμφανιστεί το μήνυμα λάθους "The number must be between 1 and 800. Please, retry." Σελίδα 88
90 IntegerUpDown Ιδιότητες Όνομα ButtonsWidth Περιγραφή Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του control. (Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control). (Κληρονομείται από την UpDownBase). ErrorMessageOnIncorrectValueType Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι τύπου Integer. (Κληρονομείται από την UpDownBase). ErrorMessageOnValueOutOfRange ErrorTemplate HasError Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι στο αποδεκτό εύρος (Minimum-Maximum). (Κληρονομείται από την UpDownBase). Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Integer. H default τιμή είναι 1. IsMinimum IsMaximum Minimum Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Minimum. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Maximum. (Κληρονομείται από την UpDownBase). Καθορίζει το ελάχιστο όριο στο control, τύπου Integer. H default τιμή είναι Integer.MinValue. Σελίδα 89
91 IntegerUpDown Maximum Value ValueFormat Καθορίζει το μέγιστο όριο στο control, τύπου Integer. H default τιμή είναι Integer.MaxValue. Η τρέχουσα τιμή στο control, τύπου Integer. H default τιμή είναι 0. Καθορίζει το StringFormat της τιμής του control. (Κληρονομείται από την UpDownBase). Σελίδα 90
92 IntegerUpDown Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Integer. Σύνταξη: Public Property Increment As Integer Τύπος: System.Integer Προσδιορίζουμε μία θετική τιμή για το βήμα αύξησης της τιμής. H default τιμή είναι 1. Dependency Property Information: Identifier field: IncrementProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το βήμα αύξησης στο UpDown1 σε 2. XAML: <zeus:integerupdown x:name="updown1" Minimum="1" Maximum="800" Increment="2" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Increment = 2 Σελίδα 91
93 IntegerUpDown Minimum Καθορίζει το ελάχιστο όριο στο control, τύπου Integer. Σύνταξη: Public Property Minimum As Integer Τύπος: System.Integer Προσδιορίζουμε μία τιμή, ως το ελάχιστο αποδεκτό όριο. H default τιμή είναι Integer.MinValue. Dependency Property Information: Identifier field: MinimumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το ελάχιστο όριο στο UpDown1 σε 10. XAML: <zeus:integerupdown x:name="updown1" Minimum="10" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Minimum = 10 Σελίδα 92
94 IntegerUpDown Maximum Καθορίζει το μέγιστο όριο στο control, τύπου Integer. Σύνταξη: Public Property Maximum As Integer Τύπος: System.Integer Προσδιορίζουμε μία τιμή, ως το μέγιστο αποδεκτό όριο. H default τιμή είναι Integer.MaxValue. Dependency Property Information: Identifier field: MaximumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το μέγιστο όριο στο UpDown1 σε 900. XAML: <zeus:integerupdown x:name="updown1" Minimum="10" Maximum="900" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Maximum = 900 Σελίδα 93
95 IntegerUpDown Value Η τρέχουσα τιμή στο control, τύπου Integer. Σύνταξη: Public Property Value As Integer Τύπος: System.Integer Η τρέχουσα τιμή. H default τιμή είναι 0. Dependency Property Information: Identifier field: ValueProperty Παρατηρήσεις: Σε μία WPF εφαρμογή, η λογική χρήση της ιδιότητας αυτής είναι μέσω μίας Binding έκφρασης. Με αυτόν τον τρόπο, η τρέχουσα τιμή συνδέεται με μία source πηγή (π.χ. μία public ιδιότητα ενός data object). Η τιμή προέρχεται από το source object και οποιαδήποτε μεταβολή της επιστρέφει στο source object (σε ένα two-way mode, που είναι και το default). Συμπερασματικά, συνιστάται η χρήση της με Binding έφραση. Παράδειγμα: Στο επόμενο παράδειγμα, η τιμή της ιδιότητας Value στο UpDown1 συνδέεται, μέσω Binding έκφρασης, με την ιδιότητα Amount1 του source object. Το τελευταίο (ένα αντικείμενο Customer) τίθεται ως πηγή δεδομένων στην ιδιότητα DataContext σε ένα container, που εδώ είναι το Grid panel. Οι τιμές των ιδιοτήτων του αντικειμένου Customer τίθενται στο τμήμα Window.Resources, αλλά θα μπορούσαν να τεθούν και στο VB κώδικα, σε κάποιον event handler. <Window x:class="mainwindow" xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> Σελίδα 94
96 IntegerUpDown <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Σελίδα 95
97 IntegerUpDown Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Integer):" /> <zeus:integerupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="800" Increment="1" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 800. Please, retry." Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) End Sub Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Βλέπουμε την αρχική κατάσταση του UpDown1. Η τιμή 12 προέρχεται από την ιδιότητα Amount1 του αντικειμένου Customer: Αν ο χρήστης φτάσει στη μέγιστη τιμή (800) τότε, λόγω του style trigger, το IntegerUpDown μορφοποιείται ως εξής: Παράλληλα, απενεργοποείται και το up arrow button. Αν ο χρήστης, πληκτρολογήσει απ' ευθείας Σελίδα 96
98 IntegerUpDown μία τιμή εκτός ορίων, τότε το control εισέρχεται σε κατάσταση λάθους: Επίσης, αν ο χρήστης, πληκτρολογήσει μία τιμή λανθασμένου τύπου, τότε το control πάλι εισέρχεται σε κατάσταση λάθους: Σελίδα 97
99 IntegerUpDown Συμβάντα Όνομα MinimumChanged Περιγραφή Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σελίδα 98
100 IntegerUpDown MinimumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. Σύνταξη: VB (ορισμός): Public Custom Event MinimumChanged As RoutedPropertyChangedEventHandler(Of Integer) XAML attribute usage: <zeus:integerupdown MinimumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MinimumChanged του UpDown1: XAML: <zeus:integerupdown x:name="updown1" Minimum="0" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" MinimumChanged="UpDown1_MinimumChanged"... /> Private Sub UpDown1_MinimumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Integer)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new minimum value is {0}", e.newvalue)) Σελίδα 99
101 IntegerUpDown MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. Σύνταξη: VB (ορισμός): Public Custom Event MaximumChanged As RoutedPropertyChangedEventHandler(Of Integer) XAML attribute usage: <zeus:integerupdown MaximumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MaximumChanged του UpDown1: XAML: <zeus:integerupdown x:name="updown1" Minimum="0" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" MaximumChanged="UpDown1_MaximumChanged"... /> Private Sub UpDown1_MaximumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Integer)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new maximum value is {0}", e.newvalue)) Σελίδα 100
102 IntegerUpDown ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σύνταξη: VB (ορισμός): Public Custom Event ValueChanged As RoutedPropertyChangedEventHandler(Of Integer) XAML attribute usage: <zeus: IntegerUpDown ValueChanged ="eventhanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν ValueChanged του UpDown1: XAML: <zeus:integerupdown x:name="updown1" Minimum="0" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged"... /> Private Sub UpDown1_ValueChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Integer)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The current value is {0}", e.newvalue)) Σελίδα 101
103 IntegerUpDown Styles και Templates Parts και States To default Style και ControlTemplate Παράδειγμα custom Style και ControlTemplate Σελίδα 102
104 IntegerUpDown Parts και States Το default ControlTemplate περιλαμβάνει κάποια part names και visual states. Μπορείτε να τροποποιήσετε το default ControlTemplate ώστε να δώσετε στο control μία μοναδική εμφάνιση. Το default ControlTemplate μπορείτε να το δείτε εδώ ώστε να πάρετε μία ιδέα και με βάση αυτό να δημιουργήσετε ένα δικό σας. Ένα παράδειγμα custom ControlTemplate μπορείτε να δείτε εδώ. Ο παρακάτω πίνακας εμφανίζει τα part names του IntegerUpDown control: Part Τύπος Περιγραφή PART_Value TextBox Το standard TextBox control. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την αύξηση της τιμής. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την μείωση της τιμής. Ο παρακάτω πίνακας εμφανίζει τα visual states του IntegerUpDown control: VisualState VisualStateGroup Περιγραφή Normal CommonStates To default state. MouseOver CommonStates Το state όταν ο δείκτης του ποντικιού είναι πάνω από το control. Disabled CommonStates Το state όταν το control είναι disabled. Focused FocusStates Το state όταν το control έχει το focus. Unfocused FocusStates Το state όταν το control δεν έχει το focus. Το default ControlTemplate έχει καθορισμένο μόνο το Disabled state. Μπορείτε να δημιουργήσετε ένα custom ControlTemplate για να το αλλάξετε ή/και για να καθορίσετε τα υπόλοιπα. Σελίδα 103
105 IntegerUpDown To default Style και ControlTemplate Ο XAML κώδικας για το default Style και ControlTemplate φαίνεται παρακάτω. Μπορείτε να βασιστείτε σε αυτόν για να δημιουργήσετε μία μικρή ή μεγάλη παραλλαγή του δικού σας custom Style και ControlTemplate: xmlns:z="clr-namespace:zeus.wpf.controls.updowncontrols"> <Style TargetType="{x:Type z:integerupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type z:integerupdown}"> <ControlTemplate.Resources > <z:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard > <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Σελίδα 104
106 IntegerUpDown Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" /> <VisualState Name="Unfocused"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" > <Grid.RowDefinitions > <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- The width of the second Grid column is about for the RepeatButtons and depends on ButtonsWidth property --> <Grid.ColumnDefinitions > <ColumnDefinition Width="*" /> <ColumnDefinition Width="{Binding RelativeSource={Relative Source Mode=FindAncestor, AncestorType={x:Type z:integerupdown}}, Path=ButtonsWidth, Converter={StaticResource doubletogridlengthconverter}}" /> </Grid.ColumnDefinitions> <TextBox Name="PART_Value" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> <Viewbox Stretch="Fill" Grid.Column="1"> <StackPanel Name="stkRepeatButtons" VerticalAlignment="Center" HorizontalAlignment="Left" Focusable="False"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> Σελίδα 105
107 IntegerUpDown </Style> </Grid> </Border> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </StackPanel> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Η δεύτερη στήλη του Grid περιέχει τα repeat buttons μέσα σε ένα StackPanel. To πλάτος της δεύτερης στήλης του Grid προσδιορίζεται με βάση την τιμή της ιδιότητας ButtonsWidth. Για να μετατραπεί η τιμή Double της ιδιότητας ButtonsWidth σε τιμή τύπου GridLength χρησιμοποιούμε μία κλάση μετατροπής τιμής (ValueConverter). Θα τη βρείτε στο Παράρτημα 2. Σελίδα 106
108 IntegerUpDown Παράδειγμα custom Style και ControlTemplate Στο επόμενο παράδειγμα, δημιουργούμε ένα custom Style και ControlTemplate. Συγκεκριμένα: Ορίζουμε ότι όταν λάβει την εστίαση, το background να γίνει κίτρινο. Αυτό γίνεται, θέτοντας στο Focused state το σχετικό Storyboard που περιέχει ένα ColorAnimation που κάνει animate το background color σε Yellow σε χρόνο 0.2 sec. Στη δομή του ControlTemplate, αλλάζουμε θέση στα up-down buttons. Το up-button βρίσκεται πάνω δεξιά από το TextBox ενώ το down-button βρίσκεται από κάτω δεξιά (3 γραμμές). Για να επιτευχθεί αυτό αλλάζει λίγο η διάταξη του Grid container, που τώρα περιέχει 3 RowDefinintions. Η λειτουργικότητα του control παραμένει η ίδια. Η εικόνα του custom IntegerUpDown σε κανονική κατάσταση - Normal state: Η εικόνα του custom IntegerUpDown όταν έχει την εστίαση - Focused state: Ο XAML κώδικας για το custom Style και ControlTemplate του παραπάνω IntegerUpDown είναι ο εξής: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncont rols" <Style TargetType="{x:Type zeus:integerupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type zeus:integerupdown}"> <ControlTemplate.Resources > <zeus:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> Σελίδα 107
109 IntegerUpDown <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" > <Storyboard > ColorAnimation Storyboard.TargetName="PART_Value" Storyboard.TargetProperty="Background.Color" To="Yellow" Duration="0:0:0.2"/> </Storyboard> </VisualState> <VisualState Name="Unfocused"/> </VisualStateGroup> Σελίδα 108
110 IntegerUpDown </Style> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" Margin="{TemplateBinding Padding}"> <Grid.RowDefinitions > <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBox Name="PART_Value" Grid.Row="1" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> </Grid> </Border> <Viewbox Stretch="Uniform" Grid.Row="0" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> <Viewbox Stretch="Uniform" Grid.Row="2" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Σελίδα 109
111 LongUpDown LongUpDown Ένα UpDown control που επιτρέπει την είσοδο μόνο αριθμητικών δεδομένων, τύπου Long. Η τιμή απαιτείται (required). Σύνταξη: <TemplateVisualState(Name:="Normal", GroupName:="CommonStates"), TemplateVisualState(Name:="MouseOver", GroupName:="CommonStates"), TemplateVisualState(Name:="Disabled", GroupName:="CommonStates"), TemplateVisualState(Name:="Focused", GroupName:="FocusStates"), TemplateVisualState(Name:="Unfocused", GroupName:="FocusStates"), TemplatePart(Name:="PART_Value", Type:=GetType(TextBox)), TemplatePart(Name:="PART_IncrementUp", Type:=GetType(RepeatButton)), TemplatePart(Name:="PART_IncrementDown", Type:=GetType(RepeatButton))> <DefaultProperty("Value")> Public Class LongUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:longupdown... /> Παράδειγμα: Στο παράδειγμα που ακολουθεί, τοποθετούμε ένα LongUpDown μέσα σε ένα Grid ενός παραθύρου. Συνδέουμε την ιδιότητα Value με την ιδιότητα Amount1, τύπου Long, ενός Customer αντικειμένου (source object). H κλάση Customer ορίζεται στο project και συνεπώς πρέπει να εισάγουμε και το αντίστοιχο namespace με alias p. Επίσης, ορίζουμε ένα ErrorTemplate για το Validation (όπου μέσω αυτού θα εμφανιστεί το μήνυμα λάθους που ορίζουμε στην ιδιότητα ErrorMessageOnIncorrectValueType ή στην ιδιότητα ErrorMessageOnValueOutOfRange ). Επιπλέον, ορίζουμε ένα Style, στοχευμένο στην κλάση UpDownBase, για την ομοιόμορφη εμφάνιση των UpDown controls στο παράθυρο. <Window x:class="mainwindow" xmlns="
112 LongUpDown xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> Σελίδα 111
113 LongUpDown <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Long):" /> <zeus:longupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="800" Increment="1" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 800. Please, retry." Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Για την κλάση Customer δείτε το Παράρτημα 1. Μία κανονική κατάσταση του LongUpDown : Σελίδα 112
114 LongUpDown Παρακάτω, βλέπουμε την ένδειξη λάθους όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Αν πάει το δείκτη του ποντικιού πάνω στο θαυμαστικό θα εμφανιστεί το μήνυμα λάθους "The number must be between 1 and 800. Please, retry." Σελίδα 113
115 LongUpDown Ιδιότητες Όνομα ButtonsWidth Περιγραφή Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του control. (Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control). (Κληρονομείται από την UpDownBase). ErrorMessageOnIncorrectValueType Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι τύπου Long. (Κληρονομείται από την UpDownBase). ErrorMessageOnValueOutOfRange ErrorTemplate HasError Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι στο αποδεκτό εύρος (Minimum-Maximum). (Κληρονομείται από την UpDownBase). Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Long. H default τιμή είναι 1. IsMinimum IsMaximum Minimum Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Minimum. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Maximum. (Κληρονομείται από την UpDownBase). Καθορίζει το ελάχιστο όριο στο control, τύπου Long. H default τιμή είναι Long.MinValue. Σελίδα 114
116 LongUpDown Maximum Value ValueFormat Καθορίζει το μέγιστο όριο στο control, τύπου Long. H default τιμή είναι Long.MaxValue. Η τρέχουσα τιμή στο control, τύπου Long. H default τιμή είναι 0. Καθορίζει το StringFormat της τιμής του control. (Κληρονομείται από την UpDownBase). Σελίδα 115
117 LongUpDown Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Long. Σύνταξη: Public Property Increment As Long Τύπος: System.Long Προσδιορίζουμε μία θετική τιμή για το βήμα αύξησης της τιμής. H default τιμή είναι 1. Dependency Property Information: Identifier field: IncrementProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το βήμα αύξησης στο UpDown1 σε 2. XAML: <zeus:longupdown x:name="updown1" Minimum="1" Maximum="800" Increment="2" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Increment = 2 Σελίδα 116
118 LongUpDown Minimum Καθορίζει το ελάχιστο όριο στο control, τύπου Long. Σύνταξη: Public Property Minimum As Long Τύπος: System.Long Προσδιορίζουμε μία τιμή, ως το ελάχιστο αποδεκτό όριο. H default τιμή είναι Long.MinValue. Dependency Property Information: Identifier field: MinimumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το ελάχιστο όριο στο UpDown1 σε 10. XAML: <zeus:longupdown x:name="updown1" Minimum="10" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Minimum = 10 Σελίδα 117
119 LongUpDown Maximum Καθορίζει το μέγιστο όριο στο control, τύπου Long. Σύνταξη: Public Property Maximum As Long Τύπος: System.Long Προσδιορίζουμε μία τιμή, ως το μέγιστο αποδεκτό όριο. H default τιμή είναι Long.MaxValue. Dependency Property Information: Identifier field: MaximumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το μέγιστο όριο στο UpDown1 σε 900. XAML: <zeus:longupdown x:name="updown1" Minimum="10" Maximum="900" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ButtonsWidth ="25"... /> UpDown1.Maximum = 900 Σελίδα 118
120 LongUpDown Value Η τρέχουσα τιμή στο control, τύπου Long. Σύνταξη: Public Property Value As Long Τύπος: System.Long Η τρέχουσα τιμή. H default τιμή είναι 0. Dependency Property Information: Identifier field: ValueProperty Παρατηρήσεις: Σε μία WPF εφαρμογή, η λογική χρήση της ιδιότητας αυτής είναι μέσω μίας Binding έκφρασης. Με αυτόν τον τρόπο, η τρέχουσα τιμή συνδέεται με μία source πηγή (π.χ. μία public ιδιότητα ενός data object). Η τιμή προέρχεται από το source object και οποιαδήποτε μεταβολή της επιστρέφει στο source object (σε ένα two-way mode, που είναι και το default). Συμπερασματικά, συνιστάται η χρήση της με Binding έφραση. Παράδειγμα: Στο επόμενο παράδειγμα, η τιμή της ιδιότητας Value στο UpDown1 συνδέεται, μέσω Binding έκφρασης, με την ιδιότητα Amount1 του source object. Το τελευταίο (ένα αντικείμενο Customer) τίθεται ως πηγή δεδομένων στην ιδιότητα DataContext σε ένα container, που εδώ είναι το Grid panel. Οι τιμές των ιδιοτήτων του αντικειμένου Customer τίθενται στο τμήμα Window.Resources, αλλά θα μπορούσαν να τεθούν και στο VB κώδικα, σε κάποιον event handler. <Window x:class="mainwindow" xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> Σελίδα 119
121 LongUpDown <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Σελίδα 120
122 LongUpDown Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Long):" /> <zeus:longupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="800" Increment="1" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 800. Please, retry." Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) End Sub Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Βλέπουμε την αρχική κατάσταση του UpDown1. Η τιμή 12 προέρχεται από την ιδιότητα Amount1 του αντικειμένου Customer: Αν ο χρήστης φτάσει στη μέγιστη τιμή (800) τότε, λόγω του style trigger, το LongUpDown μορφοποιείται ως εξής: Παράλληλα, απενεργοποείται και το up arrow button. Αν ο χρήστης, πληκτρολογήσει απ' ευθείας Σελίδα 121
123 LongUpDown μία τιμή εκτός ορίων, τότε το control εισέρχεται σε κατάσταση λάθους: Επίσης, αν ο χρήστης, πληκτρολογήσει μία τιμή λανθασμένου τύπου, τότε το control πάλι εισέρχεται σε κατάσταση λάθους: Σελίδα 122
124 LongUpDown Συμβάντα Όνομα MinimumChanged Περιγραφή Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σελίδα 123
125 LongUpDown MinimumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. Σύνταξη: VB (ορισμός): Public Custom Event MinimumChanged As RoutedPropertyChangedEventHandler(Of Long) XAML attribute usage: <zeus:longupdown MinimumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MinimumChanged του UpDown1: XAML: <zeus:longupdown x:name="updown1" Minimum="0" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" MinimumChanged="UpDown1_MinimumChanged"... /> Private Sub UpDown1_MinimumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Long)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new minimum value is {0}", e.newvalue)) Σελίδα 124
126 LongUpDown MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. Σύνταξη: VB (ορισμός): Public Custom Event MaximumChanged As RoutedPropertyChangedEventHandler(Of Long) XAML attribute usage: <zeus:longupdown MaximumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MaximumChanged του UpDown1: XAML: <zeus:longupdown x:name="updown1" Minimum="0" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" MaximumChanged="UpDown1_MaximumChanged"... /> Private Sub UpDown1_MaximumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Long)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new maximum value is {0}", e.newvalue)) Σελίδα 125
127 LongUpDown ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σύνταξη: VB (ορισμός): Public Custom Event ValueChanged As RoutedPropertyChangedEventHandler(Of Long) XAML attribute usage: <zeus:longupdown ValueChanged ="eventhanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν ValueChanged του UpDown1: XAML: <zeus:longupdown x:name="updown1" Minimum="0" Maximum="800" Increment="1" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N0" ValueChanged="UpDown1_ValueChanged"... /> Private Sub UpDown1_ValueChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Long)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The current value is {0}", e.newvalue)) Σελίδα 126
128 LongUpDown Styles και Templates Parts και States To default Style και ControlTemplate Παράδειγμα custom Style και ControlTemplate Σελίδα 127
129 LongUpDown Parts και States Το default ControlTemplate περιλαμβάνει κάποια part names και visual states. Μπορείτε να τροποποιήσετε το default ControlTemplate ώστε να δώσετε στο control μία μοναδική εμφάνιση. Το default ControlTemplate μπορείτε να το δείτε εδώ ώστε να πάρετε μία ιδέα και με βάση αυτό να δημιουργήσετε ένα δικό σας. Ένα παράδειγμα custom ControlTemplate μπορείτε να δείτε εδώ. Ο παρακάτω πίνακας εμφανίζει τα part names του LongUpDown control: Part Τύπος Περιγραφή PART_Value TextBox Το standard TextBox control. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την αύξηση της τιμής. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την μείωση της τιμής. Ο παρακάτω πίνακας εμφανίζει τα visual states του LongUpDown control: VisualState VisualStateGroup Περιγραφή Normal CommonStates To default state. MouseOver CommonStates Το state όταν ο δείκτης του ποντικιού είναι πάνω από το control. Disabled CommonStates Το state όταν το control είναι disabled. Focused FocusStates Το state όταν το control έχει το focus. Unfocused FocusStates Το state όταν το control δεν έχει το focus. Το default ControlTemplate έχει καθορισμένο μόνο το Disabled state. Μπορείτε να δημιουργήσετε ένα custom ControlTemplate για να το αλλάξετε ή/και για να καθορίσετε τα υπόλοιπα. Σελίδα 128
130 LongUpDown To default Style και ControlTemplate Ο XAML κώδικας για το default Style και ControlTemplate φαίνεται παρακάτω. Μπορείτε να βασιστείτε σε αυτόν για να δημιουργήσετε μία μικρή ή μεγάλη παραλλαγή του δικού σας custom Style και ControlTemplate: xmlns:z="clr-namespace:zeus.wpf.controls.updowncontrols"> <Style TargetType="{x:Type z:longupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type z:longupdown}"> <ControlTemplate.Resources > <z:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard > <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Σελίδα 129
131 LongUpDown Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" /> <VisualState Name="Unfocused"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" > <Grid.RowDefinitions > <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- The width of the second Grid column is about for the RepeatButtons and depends on ButtonsWidth property --> <Grid.ColumnDefinitions > <ColumnDefinition Width="*" /> <ColumnDefinition Width="{Binding RelativeSource={Relative Source Mode=FindAncestor, AncestorType={x:Type z:longupdown}}, Path=ButtonsWidth, Converter={StaticResource doubletogridlengthconverter}}" /> </Grid.ColumnDefinitions> <TextBox Name="PART_Value" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> <Viewbox Stretch="Fill" Grid.Column="1"> <StackPanel Name="stkRepeatButtons" VerticalAlignment="Center" HorizontalAlignment="Left" Focusable="False"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> Σελίδα 130
132 LongUpDown </Style> </Grid> </Border> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </StackPanel> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Η δεύτερη στήλη του Grid περιέχει τα repeat buttons μέσα σε ένα StackPanel. To πλάτος της δεύτερης στήλης του Grid προσδιορίζεται με βάση την τιμή της ιδιότητας ButtonsWidth. Για να μετατραπεί η τιμή Double της ιδιότητας ButtonsWidth σε τιμή τύπου GridLength χρησιμοποιούμε μία κλάση μετατροπής τιμής (ValueConverter). Θα τη βρείτε στο Παράρτημα 2. Σελίδα 131
133 LongUpDown Παράδειγμα custom Style και ControlTemplate Στο επόμενο παράδειγμα, δημιουργούμε ένα custom Style και ControlTemplate. Συγκεκριμένα: Ορίζουμε ότι όταν λάβει την εστίαση, το background να γίνει κίτρινο. Αυτό γίνεται, θέτοντας στο Focused state το σχετικό Storyboard που περιέχει ένα ColorAnimation που κάνει animate το background color σε Yellow σε χρόνο 0.2 sec. Στη δομή του ControlTemplate, αλλάζουμε θέση στα up-down buttons. Το up-button βρίσκεται πάνω δεξιά από το TextBox ενώ το down-button βρίσκεται από κάτω δεξιά (3 γραμμές). Για να επιτευχθεί αυτό αλλάζει λίγο η διάταξη του Grid container, που τώρα περιέχει 3 RowDefinintions. Η λειτουργικότητα του control παραμένει η ίδια. Η εικόνα του custom LongUpDown σε κανονική κατάσταση - Normal state: Η εικόνα του custom LongUpDown όταν έχει την εστίαση - Focused state: Ο XAML κώδικας για το custom Style και ControlTemplate του παραπάνω LongUpDown είναι ο εξής: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncont rols" <Style TargetType="{x:Type zeus:longupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type zeus:longupdown}"> <ControlTemplate.Resources > <zeus:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> Σελίδα 132
134 LongUpDown <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" > <Storyboard > ColorAnimation Storyboard.TargetName="PART_Value" Storyboard.TargetProperty="Background.Color" To="Yellow" Duration="0:0:0.2"/> </Storyboard> </VisualState> <VisualState Name="Unfocused"/> </VisualStateGroup> Σελίδα 133
135 LongUpDown </Style> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" Margin="{TemplateBinding Padding}"> <Grid.RowDefinitions > <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBox Name="PART_Value" Grid.Row="1" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> </Grid> </Border> <Viewbox Stretch="Uniform" Grid.Row="0" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> <Viewbox Stretch="Uniform" Grid.Row="2" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Σελίδα 134
136 SingleUpDown SingleUpDown Ένα UpDown control που επιτρέπει την είσοδο μόνο αριθμητικών δεδομένων, τύπου Single. Η τιμή απαιτείται (required). Σύνταξη: <TemplateVisualState(Name:="Normal", GroupName:="CommonStates"), TemplateVisualState(Name:="MouseOver", GroupName:="CommonStates"), TemplateVisualState(Name:="Disabled", GroupName:="CommonStates"), TemplateVisualState(Name:="Focused", GroupName:="FocusStates"), TemplateVisualState(Name:="Unfocused", GroupName:="FocusStates"), TemplatePart(Name:="PART_Value", Type:=GetType(TextBox)), TemplatePart(Name:="PART_IncrementUp", Type:=GetType(RepeatButton)), TemplatePart(Name:="PART_IncrementDown", Type:=GetType(RepeatButton))> <DefaultProperty("Value")> Public Class SingleUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:singleupdown... /> Παράδειγμα: Στο παράδειγμα που ακολουθεί, τοποθετούμε ένα SingleUpDown μέσα σε ένα Grid ενός παραθύρου. Συνδέουμε την ιδιότητα Value με την ιδιότητα Amount1, τύπου Single, ενός Customer αντικειμένου (source object). H κλάση Customer ορίζεται στο project και συνεπώς πρέπει να εισάγουμε και το αντίστοιχο namespace με alias p. Επίσης, ορίζουμε ένα ErrorTemplate για το Validation (όπου μέσω αυτού θα εμφανιστεί το μήνυμα λάθους που ορίζουμε στην ιδιότητα ErrorMessageOnIncorrectValueType ή στην ιδιότητα ErrorMessageOnValueOutOfRange). Επιπλέον, ορίζουμε ένα Style, στοχευμένο στην κλάση UpDownBase, για την ομοιόμορφη εμφάνιση των UpDown controls στο παράθυρο.
137 SingleUpDown <Window x:class="mainwindow" xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> Σελίδα 136
138 SingleUpDown </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Single):" /> <zeus:singleupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="500" Increment="0.50" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 500. Please, retry." Value="{Binding Amount1}" ValueFormat="N2" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Για την κλάση Customer δείτε το Παράρτημα 1. Μία κανονική κατάσταση του SingleUpDown: Σελίδα 137
139 SingleUpDown Παρακάτω, βλέπουμε την ένδειξη λάθους όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Αν πάει το δείκτη του ποντικιού πάνω στο θαυμαστικό θα εμφανιστεί το μήνυμα λάθους "The number must be between 1 and 500. Please, retry." Σελίδα 138
140 SingleUpDown Ιδιότητες Όνομα ButtonsWidth Περιγραφή Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του control. (Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control). (Κληρονομείται από την UpDownBase). ErrorMessageOnIncorrectValueType Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι τύπου Single. (Κληρονομείται από την UpDownBase). ErrorMessageOnValueOutOfRange ErrorTemplate HasError Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι στο αποδεκτό εύρος (Minimum-Maximum). (Κληρονομείται από την UpDownBase). Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Single. H default τιμή είναι 1. IsMinimum IsMaximum Minimum Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Minimum. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Maximum. (Κληρονομείται από την UpDownBase). Καθορίζει το ελάχιστο όριο στο control, τύπου Single. H default τιμή είναι Single.MinValue. Σελίδα 139
141 SingleUpDown Maximum Value ValueFormat Καθορίζει το μέγιστο όριο στο control, τύπου Single. H default τιμή είναι Single.MaxValue. Η τρέχουσα τιμή στο control, τύπου Single. H default τιμή είναι 0. Καθορίζει το StringFormat της τιμής του control. (Κληρονομείται από την UpDownBase). Σελίδα 140
142 SingleUpDown Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Single. Σύνταξη: Public Property Increment As Single Τύπος: System.Single Προσδιορίζουμε μία θετική τιμή για το βήμα αύξησης της τιμής. H default τιμή είναι 1. Dependency Property Information: Identifier field: IncrementProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το βήμα αύξησης στο UpDown1 σε XAML: <zeus:singleupdown x:name="updown1" Minimum="1" Maximum="500" Increment="1.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" ButtonsWidth ="25"... /> UpDown1.Increment = 1.50 Σελίδα 141
143 SingleUpDown Minimum Καθορίζει το ελάχιστο όριο στο control, τύπου Single. Σύνταξη: Public Property Minimum As Single Τύπος: System.Single Προσδιορίζουμε μία τιμή, ως το ελάχιστο αποδεκτό όριο. H default τιμή είναι Single.MinValue. Dependency Property Information: Identifier field: MinimumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το ελάχιστο όριο στο UpDown1 σε XAML: <zeus:singleupdown x:name="updown1" Minimum="10.50" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" ButtonsWidth ="25"... /> UpDown1.Minimum = Σελίδα 142
144 SingleUpDown Maximum Καθορίζει το μέγιστο όριο στο control, τύπου Single. Σύνταξη: Public Property Maximum As Single Τύπος: System.Single Προσδιορίζουμε μία τιμή, ως το μέγιστο αποδεκτό όριο. H default τιμή είναι Single.MaxValue. Dependency Property Information: Identifier field: MaximumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το μέγιστο όριο στο UpDown1 σε 900. XAML: <zeus:singleupdown x:name="updown1" Minimum="10.50" Maximum="900" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" ButtonsWidth ="25"... /> UpDown1.Maximum = 900 Σελίδα 143
145 SingleUpDown Value Η τρέχουσα τιμή στο control, τύπου Single. Σύνταξη: Public Property Value As Single Τύπος: System.Single Η τρέχουσα τιμή. H default τιμή είναι 0. Dependency Property Information: Identifier field: ValueProperty Παρατηρήσεις: Σε μία WPF εφαρμογή, η λογική χρήση της ιδιότητας αυτής είναι μέσω μίας Binding έκφρασης. Με αυτόν τον τρόπο, η τρέχουσα τιμή συνδέεται με μία source πηγή (π.χ. μία public ιδιότητα ενός data object). Η τιμή προέρχεται από το source object και οποιαδήποτε μεταβολή της επιστρέφει στο source object (σε ένα two-way mode, που είναι και το default). Συμπερασματικά, συνιστάται η χρήση της με Binding έφραση. Παράδειγμα: Στο επόμενο παράδειγμα, η τιμή της ιδιότητας Value στο UpDown1 συνδέεται, μέσω Binding έκφρασης, με την ιδιότητα Amount1 του source object. Το τελευταίο (ένα αντικείμενο Customer) τίθεται ως πηγή δεδομένων στην ιδιότητα DataContext σε ένα container, που εδώ είναι το Grid panel. Οι τιμές των ιδιοτήτων του αντικειμένου Customer τίθενται στο τμήμα Window.Resources, αλλά θα μπορούσαν να τεθούν και στο VB κώδικα, σε κάποιον event handler. <Window x:class="mainwindow" xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> Σελίδα 144
146 SingleUpDown <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Σελίδα 145
147 SingleUpDown Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Single):" /> <zeus:singleupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="500" Increment="0.50" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 500. Please, retry." Value="{Binding Amount1}" ValueFormat="N2" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) End Sub Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Βλέπουμε την αρχική κατάσταση του UpDown1. Η τιμή προέρχεται από την ιδιότητα Amount1 του αντικειμένου Customer: Αν ο χρήστης φτάσει στη μέγιστη τιμή (500) τότε, λόγω του style trigger, το SingleUpDown μορφοποιείται ως εξής: Παράλληλα, απενεργοποείται και το up arrow button. Αν ο χρήστης, πληκτρολογήσει απ' ευθείας Σελίδα 146
148 SingleUpDown μία τιμή εκτός ορίων, τότε το control εισέρχεται σε κατάσταση λάθους: Επίσης, αν ο χρήστης, πληκτρολογήσει μία τιμή λανθασμένου τύπου, τότε το control πάλι εισέρχεται σε κατάσταση λάθους: Σελίδα 147
149 SingleUpDown Συμβάντα Όνομα MinimumChanged Περιγραφή Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σελίδα 148
150 SingleUpDown MinimumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. Σύνταξη: VB (ορισμός): Public Custom Event MinimumChanged As RoutedPropertyChangedEventHandler(Of Single) XAML attribute usage: <zeus:singleupdown MinimumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MinimumChanged του UpDown1: XAML: <zeus:singleupdown x:name="updown1" Minimum="0" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" MinimumChanged="UpDown1_MinimumChanged"... /> Private Sub UpDown1_MinimumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Single)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new minimum value is {0}", e.newvalue)) Σελίδα 149
151 SingleUpDown MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. Σύνταξη: VB (ορισμός): Public Custom Event MaximumChanged As RoutedPropertyChangedEventHandler(Of Single) XAML attribute usage: <zeus:singleupdown MaximumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MaximumChanged του UpDown1: XAML: <zeus:singleupdown x:name="updown1" Minimum="0" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" MaximumChanged="UpDown1_MaximumChanged"... /> Private Sub UpDown1_MaximumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Single)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new maximum value is {0}", e.newvalue)) Σελίδα 150
152 SingleUpDown ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σύνταξη: VB (ορισμός): Public Custom Event ValueChanged As RoutedPropertyChangedEventHandler(Of Single) XAML attribute usage: <zeus:singleupdown ValueChanged ="eventhanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν ValueChanged του UpDown1: XAML: <zeus:singleupdown x:name="updown1" Minimum="0" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" ValueChanged="UpDown1_ValueChanged"... /> Private Sub UpDown1_ValueChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Single)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The current value is {0}", e.newvalue)) Σελίδα 151
153 SingleUpDown Styles και Templates Parts και States To default Style και ControlTemplate Παράδειγμα custom Style και ControlTemplate Σελίδα 152
154 SingleUpDown Parts και States Το default ControlTemplate περιλαμβάνει κάποια part names και visual states. Μπορείτε να τροποποιήσετε το default ControlTemplate ώστε να δώσετε στο control μία μοναδική εμφάνιση. Το default ControlTemplate μπορείτε να το δείτε εδώ ώστε να πάρετε μία ιδέα και με βάση αυτό να δημιουργήσετε ένα δικό σας. Ένα παράδειγμα custom ControlTemplate μπορείτε να δείτε εδώ. Ο παρακάτω πίνακας εμφανίζει τα part names του SingleUpDown control: Part Τύπος Περιγραφή PART_Value TextBox Το standard TextBox control. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την αύξηση της τιμής. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την μείωση της τιμής. Ο παρακάτω πίνακας εμφανίζει τα visual states του SingleUpDown control: VisualState VisualStateGroup Περιγραφή Normal CommonStates To default state. MouseOver CommonStates Το state όταν ο δείκτης του ποντικιού είναι πάνω από το control. Disabled CommonStates Το state όταν το control είναι disabled. Focused FocusStates Το state όταν το control έχει το focus. Unfocused FocusStates Το state όταν το control δεν έχει το focus. Το default ControlTemplate έχει καθορισμένο μόνο το Disabled state. Μπορείτε να δημιουργήσετε ένα custom ControlTemplate για να το αλλάξετε ή/και για να καθορίσετε τα υπόλοιπα. Σελίδα 153
155 SingleUpDown To default Style και ControlTemplate Ο XAML κώδικας για το default Style και ControlTemplate φαίνεται παρακάτω. Μπορείτε να βασιστείτε σε αυτόν για να δημιουργήσετε μία μικρή ή μεγάλη παραλλαγή του δικού σας custom Style και ControlTemplate: xmlns:z="clr-namespace:zeus.wpf.controls.updowncontrols"> <Style TargetType="{x:Type z:singleupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type z:singleupdown}"> <ControlTemplate.Resources > <z:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard > <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Σελίδα 154
156 SingleUpDown Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" /> <VisualState Name="Unfocused"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" > <Grid.RowDefinitions > <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- The width of the second Grid column is about for the RepeatButtons and depends on ButtonsWidth property --> <Grid.ColumnDefinitions > <ColumnDefinition Width="*" /> <ColumnDefinition Width="{Binding RelativeSource={Relative Source Mode=FindAncestor, AncestorType={x:Type z:singleupdown}}, Path=ButtonsWidth, Converter={StaticResource doubletogridlengthconverter}}" /> </Grid.ColumnDefinitions> <TextBox Name="PART_Value" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> <Viewbox Stretch="Fill" Grid.Column="1"> <StackPanel Name="stkRepeatButtons" VerticalAlignment="Center" HorizontalAlignment="Left" Focusable="False"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> Σελίδα 155
157 SingleUpDown </Style> </Grid> </Border> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </StackPanel> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Η δεύτερη στήλη του Grid περιέχει τα repeat buttons μέσα σε ένα StackPanel. To πλάτος της δεύτερης στήλης του Grid προσδιορίζεται με βάση την τιμή της ιδιότητας ButtonsWidth. Για να μετατραπεί η τιμή Double της ιδιότητας ButtonsWidth σε τιμή τύπου GridLength χρησιμοποιούμε μία κλάση μετατροπής τιμής (ValueConverter). Θα τη βρείτε στο Παράρτημα 2. Σελίδα 156
158 SingleUpDown Παράδειγμα custom Style και ControlTemplate Στο επόμενο παράδειγμα, δημιουργούμε ένα custom Style και ControlTemplate. Συγκεκριμένα: Ορίζουμε ότι όταν λάβει την εστίαση, το background να γίνει κίτρινο. Αυτό γίνεται, θέτοντας στο Focused state το σχετικό Storyboard που περιέχει ένα ColorAnimation που κάνει animate το background color σε Yellow σε χρόνο 0.2 sec. Στη δομή του ControlTemplate, αλλάζουμε θέση στα up-down buttons. Το up-button βρίσκεται πάνω δεξιά από το TextBox ενώ το down-button βρίσκεται από κάτω δεξιά (3 γραμμές). Για να επιτευχθεί αυτό αλλάζει λίγο η διάταξη του Grid container, που τώρα περιέχει 3 RowDefinintions. Η λειτουργικότητα του control παραμένει η ίδια. Η εικόνα του custom SingleUpDown σε κανονική κατάσταση - Normal state: Η εικόνα του custom SingleUpDown όταν έχει την εστίαση - Focused state: Ο XAML κώδικας για το custom Style και ControlTemplate του παραπάνω SingleUpDown είναι ο εξής: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncont rols" <Style TargetType="{x:Type zeus:singleupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type zeus:singleupdown}"> <ControlTemplate.Resources > <zeus:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> Σελίδα 157
159 SingleUpDown <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" > <Storyboard > ColorAnimation Storyboard.TargetName="PART_Value" Storyboard.TargetProperty="Background.Color" To="Yellow" Duration="0:0:0.2"/> </Storyboard> </VisualState> <VisualState Name="Unfocused"/> </VisualStateGroup> Σελίδα 158
160 SingleUpDown </Style> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" Margin="{TemplateBinding Padding}"> <Grid.RowDefinitions > <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBox Name="PART_Value" Grid.Row="1" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> </Grid> </Border> <Viewbox Stretch="Uniform" Grid.Row="0" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> <Viewbox Stretch="Uniform" Grid.Row="2" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Σελίδα 159
161 DoubleUpDown DoubleUpDown Ένα UpDown control που επιτρέπει την είσοδο μόνο αριθμητικών δεδομένων, τύπου Double. Η τιμή απαιτείται (required). Σύνταξη: <TemplateVisualState(Name:="Normal", GroupName:="CommonStates"), TemplateVisualState(Name:="MouseOver", GroupName:="CommonStates"), TemplateVisualState(Name:="Disabled", GroupName:="CommonStates"), TemplateVisualState(Name:="Focused", GroupName:="FocusStates"), TemplateVisualState(Name:="Unfocused", GroupName:="FocusStates"), TemplatePart(Name:="PART_Value", Type:=GetType(TextBox)), TemplatePart(Name:="PART_IncrementUp", Type:=GetType(RepeatButton)), TemplatePart(Name:="PART_IncrementDown", Type:=GetType(RepeatButton))> <DefaultProperty("Value")> Public Class DoubleUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:doubleupdown... /> Παράδειγμα: Στο παράδειγμα που ακολουθεί, τοποθετούμε ένα DoubleUpDown μέσα σε ένα Grid ενός παραθύρου. Συνδέουμε την ιδιότητα Value με την ιδιότητα Amount1, τύπου Double, ενός Customer αντικειμένου (source object). H κλάση Customer ορίζεται στο project και συνεπώς πρέπει να εισάγουμε και το αντίστοιχο namespace με alias p. Επίσης, ορίζουμε ένα ErrorTemplate για το Validation (όπου μέσω αυτού θα εμφανιστεί το μήνυμα λάθους που ορίζουμε στην ιδιότητα ErrorMessageOnIncorrectValueType ή στην ιδιότητα ErrorMessageOnValueOutOfRange ). Επιπλέον, ορίζουμε ένα Style, στοχευμένο στην κλάση UpDownBase, για την ομοιόμορφη εμφάνιση των UpDown controls στο παράθυρο. <Window x:class="mainwindow" xmlns="
162 DoubleUpDown xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> Σελίδα 161
163 DoubleUpDown <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Double):" /> <zeus:doubleupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="500" Increment="0.50" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 500. Please, retry." Value="{Binding Amount1}" ValueFormat="N2" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Για την κλάση Customer δείτε το Παράρτημα 1. Μία κανονική κατάσταση του DoubleUpDown : Σελίδα 162
164 DoubleUpDown Παρακάτω, βλέπουμε την ένδειξη λάθους όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Αν πάει το δείκτη του ποντικιού πάνω στο θαυμαστικό θα εμφανιστεί το μήνυμα λάθους "The number must be between 1 and 500. Please, retry." Σελίδα 163
165 DoubleUpDown Ιδιότητες Όνομα ButtonsWidth Περιγραφή Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του control. (Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control). (Κληρονομείται από την UpDownBase). ErrorMessageOnIncorrectValueType Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι τύπου Double. (Κληρονομείται από την UpDownBase). ErrorMessageOnValueOutOfRange ErrorTemplate HasError Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι στο αποδεκτό εύρος (Minimum-Maximum). (Κληρονομείται από την UpDownBase). Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Double. H default τιμή είναι 1. IsMinimum IsMaximum Minimum Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Minimum. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Maximum. (Κληρονομείται από την UpDownBase). Καθορίζει το ελάχιστο όριο στο control, τύπου Double. H default τιμή είναι Double.MinValue. Σελίδα 164
166 DoubleUpDown Maximum Value ValueFormat Καθορίζει το μέγιστο όριο στο control, τύπου Double. H default τιμή είναι Double.MaxValue. Η τρέχουσα τιμή στο control, τύπου Double. H default τιμή είναι 0. Καθορίζει το StringFormat της τιμής του control. (Κληρονομείται από την UpDownBase). Σελίδα 165
167 DoubleUpDown Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Double. Σύνταξη: Public Property Increment As Double Τύπος: System.Double Προσδιορίζουμε μία θετική τιμή για το βήμα αύξησης της τιμής. H default τιμή είναι 1. Dependency Property Information: Identifier field: IncrementProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το βήμα αύξησης στο UpDown1 σε XAML: <zeus:doubleupdown x:name="updown1" Minimum="1" Maximum="500" Increment="1.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" ButtonsWidth ="25"... /> UpDown1.Increment = 1.50 Σελίδα 166
168 DoubleUpDown Minimum Καθορίζει το ελάχιστο όριο στο control, τύπου Double. Σύνταξη: Public Property Minimum As Double Τύπος: System.Double Προσδιορίζουμε μία τιμή, ως το ελάχιστο αποδεκτό όριο. H default τιμή είναι Double.MinValue. Dependency Property Information: Identifier field: MinimumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το ελάχιστο όριο στο UpDown1 σε XAML: <zeus:doubleupdown x:name="updown1" Minimum="10.50" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" ButtonsWidth ="25"... /> UpDown1.Minimum = Σελίδα 167
169 DoubleUpDown Maximum Καθορίζει το μέγιστο όριο στο control, τύπου Double. Σύνταξη: Public Property Maximum As Double Τύπος: System.Double Προσδιορίζουμε μία τιμή, ως το μέγιστο αποδεκτό όριο. H default τιμή είναι Double.MaxValue. Dependency Property Information: Identifier field: MaximumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το μέγιστο όριο στο UpDown1 σε 900. XAML: <zeus:doubleupdown x:name="updown1" Minimum="10.50" Maximum="900" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" ButtonsWidth ="25"... /> UpDown1.Maximum = 900 Σελίδα 168
170 DoubleUpDown Value Η τρέχουσα τιμή στο control, τύπου Double. Σύνταξη: Public Property Value As Double Τύπος: System.Double Η τρέχουσα τιμή. H default τιμή είναι 0. Dependency Property Information: Identifier field: ValueProperty Παρατηρήσεις: Σε μία WPF εφαρμογή, η λογική χρήση της ιδιότητας αυτής είναι μέσω μίας Binding έκφρασης. Με αυτόν τον τρόπο, η τρέχουσα τιμή συνδέεται με μία source πηγή (π.χ. μία public ιδιότητα ενός data object). Η τιμή προέρχεται από το source object και οποιαδήποτε μεταβολή της επιστρέφει στο source object (σε ένα two-way mode, που είναι και το default). Συμπερασματικά, συνιστάται η χρήση της με Binding έφραση. Παράδειγμα: Στο επόμενο παράδειγμα, η τιμή της ιδιότητας Value στο UpDown1 συνδέεται, μέσω Binding έκφρασης, με την ιδιότητα Amount1 του source object. Το τελευταίο (ένα αντικείμενο Customer) τίθεται ως πηγή δεδομένων στην ιδιότητα DataContext σε ένα container, που εδώ είναι το Grid panel. Οι τιμές των ιδιοτήτων του αντικειμένου Customer τίθενται στο τμήμα Window.Resources, αλλά θα μπορούσαν να τεθούν και στο VB κώδικα, σε κάποιον event handler. <Window x:class="mainwindow" xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> Σελίδα 169
171 DoubleUpDown <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Σελίδα 170
172 DoubleUpDown Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Double):" /> <zeus:doubleupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="500" Increment="0.50" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 500. Please, retry." Value="{Binding Amount1}" ValueFormat="N2" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) End Sub Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Βλέπουμε την αρχική κατάσταση του UpDown1. Η τιμή προέρχεται από την ιδιότητα Amount1 του αντικειμένου Customer: Αν ο χρήστης φτάσει στην ελάχιστη τιμή (1.00) τότε, λόγω του style trigger, το DoubleUpDown μορφοποιείται ως εξής: Παράλληλα, απενεργοποείται και το down arrow button. Αν ο χρήστης, πληκτρολογήσει απ' ευθείας Σελίδα 171
173 DoubleUpDown μία τιμή εκτός ορίων, τότε το control εισέρχεται σε κατάσταση λάθους: Επίσης, αν ο χρήστης, πληκτρολογήσει μία τιμή λανθασμένου τύπου, τότε το control πάλι εισέρχεται σε κατάσταση λάθους: Σελίδα 172
174 DoubleUpDown Συμβάντα Όνομα MinimumChanged Περιγραφή Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σελίδα 173
175 DoubleUpDown MinimumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. Σύνταξη: VB (ορισμός): Public Custom Event MinimumChanged As RoutedPropertyChangedEventHandler(Of Double) XAML attribute usage: <zeus:doubleupdown MinimumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MinimumChanged του UpDown1: XAML: <zeus:doubleupdown x:name="updown1" Minimum="0" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" MinimumChanged="UpDown1_MinimumChanged"... /> Private Sub UpDown1_MinimumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Double)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new minimum value is {0}", e.newvalue)) Σελίδα 174
176 DoubleUpDown MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. Σύνταξη: VB (ορισμός): Public Custom Event MaximumChanged As RoutedPropertyChangedEventHandler(Of Double) XAML attribute usage: <zeus:doubleupdown MaximumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MaximumChanged του UpDown1: XAML: <zeus:doubleupdown x:name="updown1" Minimum="0" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" MaximumChanged="UpDown1_MaximumChanged"... /> Private Sub UpDown1_MaximumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Double)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new maximum value is {0}", e.newvalue)) Σελίδα 175
177 DoubleUpDown ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σύνταξη: VB (ορισμός): Public Custom Event ValueChanged As RoutedPropertyChangedEventHandler(Of Double) XAML attribute usage: <zeus:doubleupdown ValueChanged ="eventhanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν ValueChanged του UpDown1: XAML: <zeus:doubleupdown x:name="updown1" Minimum="0" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="N2" ValueChanged="UpDown1_ValueChanged"... /> Private Sub UpDown1_ValueChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Double)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The current value is {0}", e.newvalue)) Σελίδα 176
178 DoubleUpDown Styles και Templates Parts και States To default Style και ControlTemplate Παράδειγμα custom Style και ControlTemplate Σελίδα 177
179 DoubleUpDown Parts και States Το default ControlTemplate περιλαμβάνει κάποια part names και visual states. Μπορείτε να τροποποιήσετε το default ControlTemplate ώστε να δώσετε στο control μία μοναδική εμφάνιση. Το default ControlTemplate μπορείτε να το δείτε εδώ ώστε να πάρετε μία ιδέα και με βάση αυτό να δημιουργήσετε ένα δικό σας. Ένα παράδειγμα custom ControlTemplate μπορείτε να δείτε εδώ. Ο παρακάτω πίνακας εμφανίζει τα part names του DoubleUpDown control: Part Τύπος Περιγραφή PART_Value TextBox Το standard TextBox control. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την αύξηση της τιμής. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την μείωση της τιμής. Ο παρακάτω πίνακας εμφανίζει τα visual states του DoubleUpDown control: VisualState VisualStateGroup Περιγραφή Normal CommonStates To default state. MouseOver CommonStates Το state όταν ο δείκτης του ποντικιού είναι πάνω από το control. Disabled CommonStates Το state όταν το control είναι disabled. Focused FocusStates Το state όταν το control έχει το focus. Unfocused FocusStates Το state όταν το control δεν έχει το focus. Το default ControlTemplate έχει καθορισμένο μόνο το Disabled state. Μπορείτε να δημιουργήσετε ένα custom ControlTemplate για να το αλλάξετε ή/και για να καθορίσετε τα υπόλοιπα. Σελίδα 178
180 DoubleUpDown To default Style και ControlTemplate Ο XAML κώδικας για το default Style και ControlTemplate φαίνεται παρακάτω. Μπορείτε να βασιστείτε σε αυτόν για να δημιουργήσετε μία μικρή ή μεγάλη παραλλαγή του δικού σας custom Style και ControlTemplate: xmlns:z="clr-namespace:zeus.wpf.controls.updowncontrols"> <Style TargetType="{x:Type z:doubleupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type z:doubleupdown}"> <ControlTemplate.Resources > <z:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard > <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Σελίδα 179
181 DoubleUpDown Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" /> <VisualState Name="Unfocused"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" > <Grid.RowDefinitions > <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- The width of the second Grid column is about for the RepeatButtons and depends on ButtonsWidth property --> <Grid.ColumnDefinitions > <ColumnDefinition Width="*" /> <ColumnDefinition Width="{Binding RelativeSource={Relative Source Mode=FindAncestor, AncestorType={x:Type z:doubleupdown}}, Path=ButtonsWidth, Converter={StaticResource doubletogridlengthconverter}}" /> </Grid.ColumnDefinitions> <TextBox Name="PART_Value" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> <Viewbox Stretch="Fill" Grid.Column="1"> <StackPanel Name="stkRepeatButtons" VerticalAlignment="Center" HorizontalAlignment="Left" Focusable="False"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> Σελίδα 180
182 DoubleUpDown </Style> </Grid> </Border> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </StackPanel> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Η δεύτερη στήλη του Grid περιέχει τα repeat buttons μέσα σε ένα StackPanel. To πλάτος της δεύτερης στήλης του Grid προσδιορίζεται με βάση την τιμή της ιδιότητας ButtonsWidth. Για να μετατραπεί η τιμή Double της ιδιότητας ButtonsWidth σε τιμή τύπου GridLength χρησιμοποιούμε μία κλάση μετατροπής τιμής (ValueConverter). Θα τη βρείτε στο Παράρτημα 2. Σελίδα 181
183 DoubleUpDown Παράδειγμα custom Style και ControlTemplate Στο επόμενο παράδειγμα, δημιουργούμε ένα custom Style και ControlTemplate. Συγκεκριμένα: Ορίζουμε ότι όταν λάβει την εστίαση, το background να γίνει κίτρινο. Αυτό γίνεται, θέτοντας στο Focused state το σχετικό Storyboard που περιέχει ένα ColorAnimation που κάνει animate το background color σε Yellow σε χρόνο 0.2 sec. Στη δομή του ControlTemplate, αλλάζουμε θέση στα up-down buttons. Το up-button βρίσκεται πάνω δεξιά από το TextBox ενώ το down-button βρίσκεται από κάτω δεξιά (3 γραμμές). Για να επιτευχθεί αυτό αλλάζει λίγο η διάταξη του Grid container, που τώρα περιέχει 3 RowDefinintions. Η λειτουργικότητα του control παραμένει η ίδια. Η εικόνα του custom DoubleUpDown σε κανονική κατάσταση - Normal state: Η εικόνα του custom DoubleUpDown όταν έχει την εστίαση - Focused state: Ο XAML κώδικας για το custom Style και ControlTemplate του παραπάνω DoubleUpDown είναι ο εξής: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncont rols" <Style TargetType="{x:Type zeus:doubleupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type zeus:doubleupdown}"> <ControlTemplate.Resources > <zeus:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> Σελίδα 182
184 DoubleUpDown <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" > <Storyboard > ColorAnimation Storyboard.TargetName="PART_Value" Storyboard.TargetProperty="Background.Color" To="Yellow" Duration="0:0:0.2"/> </Storyboard> </VisualState> <VisualState Name="Unfocused"/> </VisualStateGroup> Σελίδα 183
185 DoubleUpDown </Style> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" Margin="{TemplateBinding Padding}"> <Grid.RowDefinitions > <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBox Name="PART_Value" Grid.Row="1" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> </Grid> </Border> <Viewbox Stretch="Uniform" Grid.Row="0" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> <Viewbox Stretch="Uniform" Grid.Row="2" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Σελίδα 184
186 DecimalUpDown DecimalUpDown Ένα UpDown control που επιτρέπει την είσοδο μόνο αριθμητικών δεδομένων, τύπου Decimal. Η τιμή απαιτείται (required). Σύνταξη: <TemplateVisualState(Name:="Normal", GroupName:="CommonStates"), TemplateVisualState(Name:="MouseOver", GroupName:="CommonStates"), TemplateVisualState(Name:="Disabled", GroupName:="CommonStates"), TemplateVisualState(Name:="Focused", GroupName:="FocusStates"), TemplateVisualState(Name:="Unfocused", GroupName:="FocusStates"), TemplatePart(Name:="PART_Value", Type:=GetType(TextBox)), TemplatePart(Name:="PART_IncrementUp", Type:=GetType(RepeatButton)), TemplatePart(Name:="PART_IncrementDown", Type:=GetType(RepeatButton))> <DefaultProperty("Value")> Public Class DecimalUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:decimalupdown... /> Παράδειγμα: Στο παράδειγμα που ακολουθεί, τοποθετούμε ένα DecimalUpDown μέσα σε ένα Grid ενός παραθύρου. Συνδέουμε την ιδιότητα Value με την ιδιότητα Amount1, τύπου Decimal, ενός Customer αντικειμένου (source object). H κλάση Customer ορίζεται στο project και συνεπώς πρέπει να εισάγουμε και το αντίστοιχο namespace με alias p. Επίσης, ορίζουμε ένα ErrorTemplate για το Validation (όπου μέσω αυτού θα εμφανιστεί το μήνυμα λάθους που ορίζουμε στην ιδιότητα ErrorMessageOnIncorrectValueType ή στην ιδιότητα ErrorMessageOnValueOutOfRange ). Επιπλέον, ορίζουμε ένα Style, στοχευμένο στην κλάση UpDownBase, για την ομοιόμορφη εμφάνιση των UpDown controls στο παράθυρο. <Window x:class="mainwindow" xmlns="
187 DecimalUpDown xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock}"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> Σελίδα 186
188 DecimalUpDown <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Decimal):" /> <zeus:decimalupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="500" Increment="0.50" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 500. Please, retry." Value="{Binding Amount1}" ValueFormat="C2" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Για την κλάση Customer δείτε το Παράρτημα 1. Μία κανονική κατάσταση του DecimalUpDown (νομισματική μορφή με culture "el"): Σελίδα 187
189 DecimalUpDown Παρακάτω, βλέπουμε την ένδειξη λάθους όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Αν πάει το δείκτη του ποντικιού πάνω στο θαυμαστικό θα εμφανιστεί το μήνυμα λάθους "The number must be between 1 and 500. Please, retry." Σελίδα 188
190 DecimalUpDown Ιδιότητες Όνομα ButtonsWidth Περιγραφή Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του control. (Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control). (Κληρονομείται από την UpDownBase). ErrorMessageOnIncorrectValueType Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι τύπου Decimal. (Κληρονομείται από την UpDownBase). ErrorMessageOnValueOutOfRange ErrorTemplate HasError Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι στο αποδεκτό εύρος (Minimum-Maximum). (Κληρονομείται από την UpDownBase). Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Decimal. H default τιμή είναι 1. IsMinimum IsMaximum Minimum Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Minimum. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε η τρέχουσα τιμή έχει φτάσει στο μέγιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα Maximum. (Κληρονομείται από την UpDownBase). Καθορίζει το ελάχιστο όριο στο control, τύπου Decimal. H default τιμή είναι Decimal.MinValue. Σελίδα 189
191 DecimalUpDown Maximum Value ValueFormat Καθορίζει το μέγιστο όριο στο control, τύπου Decimal. H default τιμή είναι Decimal.MaxValue. Η τρέχουσα τιμή στο control, τύπου Decimal. H default τιμή είναι 0. Καθορίζει το StringFormat της τιμής του control. (Κληρονομείται από την UpDownBase). Σελίδα 190
192 DecimalUpDown Increment Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Decimal. Σύνταξη: Public Property Increment As Decimal Τύπος: System.Decimal Προσδιορίζουμε μία θετική τιμή για το βήμα αύξησης της τιμής. H default τιμή είναι 1. Dependency Property Information: Identifier field: IncrementProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το βήμα αύξησης στο UpDown1 σε XAML: <zeus:decimalupdown x:name="updown1" Minimum="1" Maximum="500" Increment="1.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="C2" ButtonsWidth ="25"... /> UpDown1.Increment = 1.50 Σελίδα 191
193 DecimalUpDown Minimum Καθορίζει το ελάχιστο όριο στο control, τύπου Decimal. Σύνταξη: Public Property Minimum As Decimal Τύπος: System.Decimal Προσδιορίζουμε μία τιμή, ως το ελάχιστο αποδεκτό όριο. H default τιμή είναι Decimal.MinValue. Dependency Property Information: Identifier field: MinimumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το ελάχιστο όριο στο UpDown1 σε XAML: <zeus:decimalupdown x:name="updown1" Minimum="10.50" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="C2" ButtonsWidth ="25"... /> UpDown1.Minimum = Σελίδα 192
194 DecimalUpDown Maximum Καθορίζει το μέγιστο όριο στο control, τύπου Decimal. Σύνταξη: Public Property Maximum As Decimal Τύπος: System.Decimal Προσδιορίζουμε μία τιμή, ως το μέγιστο αποδεκτό όριο. H default τιμή είναι Decimal.MaxValue. Dependency Property Information: Identifier field: MaximumProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το μέγιστο όριο στο UpDown1 σε 900. XAML: <zeus:decimalupdown x:name="updown1" Minimum="10.50" Maximum="900" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="C2" Language="el" ButtonsWidth ="25"... /> UpDown1.Maximum = 900 Σελίδα 193
195 DecimalUpDown Value Η τρέχουσα τιμή στο control, τύπου Decimal. Σύνταξη: Public Property Value As Decimal Τύπος: System.Decimal Η τρέχουσα τιμή. H default τιμή είναι 0. Dependency Property Information: Identifier field: ValueProperty Παρατηρήσεις: Σε μία WPF εφαρμογή, η λογική χρήση της ιδιότητας αυτής είναι μέσω μίας Binding έκφρασης. Με αυτόν τον τρόπο, η τρέχουσα τιμή συνδέεται με μία source πηγή (π.χ. μία public ιδιότητα ενός data object). Η τιμή προέρχεται από το source object και οποιαδήποτε μεταβολή της επιστρέφει στο source object (σε ένα two-way mode, που είναι και το default). Συμπερασματικά, συνιστάται η χρήση της με Binding έφραση. Παράδειγμα: Στο επόμενο παράδειγμα, η τιμή της ιδιότητας Value στο UpDown1 συνδέεται, μέσω Binding έκφρασης, με την ιδιότητα Amount1 του source object. Το τελευταίο (ένα αντικείμενο Customer) τίθεται ως πηγή δεδομένων στην ιδιότητα DataContext σε ένα container, που εδώ είναι το Grid panel. Οι τιμές των ιδιοτήτων του αντικειμένου Customer τίθενται στο τμήμα Window.Resources, αλλά θα μπορούσαν να τεθούν και στο VB κώδικα, σε κάποιον event handler. <Window x:class="mainwindow" xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> Σελίδα 194
196 DecimalUpDown <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock }"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Σελίδα 195
197 DecimalUpDown Amount1="12"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Amount (Decimal):" /> <zeus:decimalupdown Name="UpDown1" Grid.Column="1" Minimum="1" Maximum="500" Increment="0.50" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnIncorrectValueType = "Please, enter a valid value!" ErrorMessageOnValueOutOfRange = "The number must be between 1 and 500. Please, retry." Value="{Binding Amount1}" ValueFormat="C2" ValueChanged="UpDown1_ValueChanged" Style="{StaticResource UpDownStyle}"/>... </Grid> </Window> Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) End Sub Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Βλέπουμε την αρχική κατάσταση του UpDown1. Η τιμή προέρχεται από την ιδιότητα Amount1 του αντικειμένου Customer: Αν ο χρήστης φτάσει στην μέγιστη τιμή (500) τότε, λόγω του style trigger, το DecimalUpDown μορφοποιείται ως εξής: Παράλληλα, απενεργοποείται και το up arrow button. Αν ο χρήστης, πληκτρολογήσει απ' ευθείας Σελίδα 196
198 DecimalUpDown μία τιμή εκτός ορίων, τότε το control εισέρχεται σε κατάσταση λάθους: Επίσης, αν ο χρήστης, πληκτρολογήσει μία τιμή λανθασμένου τύπου, τότε το control πάλι εισέρχεται σε κατάσταση λάθους: Σελίδα 197
199 DecimalUpDown Συμβάντα Όνομα MinimumChanged Περιγραφή Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σελίδα 198
200 DecimalUpDown MinimumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Minimum. Σύνταξη: VB (ορισμός): Public Custom Event MinimumChanged As RoutedPropertyChangedEventHandler(Of Decimal) XAML attribute usage: <zeus:decimalupdown MinimumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MinimumChanged του UpDown1: XAML: <zeus:decimalupdown x:name="updown1" Minimum="0" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="C2" Language="el" MinimumChanged="UpDown1_MinimumChanged"... /> Private Sub UpDown1_MinimumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Decimal)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new minimum value is {0}", e.newvalue)) Σελίδα 199
201 DecimalUpDown MaximumChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Maximum. Σύνταξη: VB (ορισμός): Public Custom Event MaximumChanged As RoutedPropertyChangedEventHandler(Of Decimal) XAML attribute usage: <zeus:decimalupdown MaximumChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν MaximumChanged του UpDown1: XAML: <zeus:decimalupdown x:name="updown1" Minimum="0" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="C2" Language="el" MaximumChanged="UpDown1_MaximumChanged"... /> Private Sub UpDown1_MaximumChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Decimal)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The new maximum value is {0}", e.newvalue)) Σελίδα 200
202 DecimalUpDown ValueChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα Value. Σύνταξη: VB (ορισμός): Public Custom Event ValueChanged As RoutedPropertyChangedEventHandler(Of Decimal) XAML attribute usage: <zeus:decimalupdown ValueChanged ="eventhanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον eventhandler για το συμβάν ValueChanged του UpDown1: XAML: <zeus:decimalupdown x:name="updown1" Minimum="0" Maximum="500" Increment="0.50" HorizontalContentAlignment="Right" Value="{Binding Amount1}" ValueFormat="C2" Language="el" ValueChanged="UpDown1_ValueChanged"... /> Private Sub UpDown1_ValueChanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Decimal)) End Sub If e IsNot Nothing Then End If MessageBox.Show(String.Format("The current value is {0}", e.newvalue)) Σελίδα 201
203 DecimalUpDown Styles και Templates Parts και States To default Style και ControlTemplate Παράδειγμα custom Style και ControlTemplate Σελίδα 202
204 DecimalUpDown Parts και States Το default ControlTemplate περιλαμβάνει κάποια part names και visual states. Μπορείτε να τροποποιήσετε το default ControlTemplate ώστε να δώσετε στο control μία μοναδική εμφάνιση. Το default ControlTemplate μπορείτε να το δείτε εδώ ώστε να πάρετε μία ιδέα και με βάση αυτό να δημιουργήσετε ένα δικό σας. Ένα παράδειγμα custom ControlTemplate μπορείτε να δείτε εδώ. Ο παρακάτω πίνακας εμφανίζει τα part names του DecimalUpDown control: Part Τύπος Περιγραφή PART_Value TextBox Το standard TextBox control. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την αύξηση της τιμής. PART_IncrementUp RepeatButton To RepeatButton που επιτρέπει την μείωση της τιμής. Ο παρακάτω πίνακας εμφανίζει τα visual states του DecimalUpDown control: VisualState VisualStateGroup Περιγραφή Normal CommonStates To default state. MouseOver CommonStates Το state όταν ο δείκτης του ποντικιού είναι πάνω από το control. Disabled CommonStates Το state όταν το control είναι disabled. Focused FocusStates Το state όταν το control έχει το focus. Unfocused FocusStates Το state όταν το control δεν έχει το focus. Το default ControlTemplate έχει καθορισμένο μόνο το Disabled state. Μπορείτε να δημιουργήσετε ένα custom ControlTemplate για να το αλλάξετε ή/και για να καθορίσετε τα υπόλοιπα. Σελίδα 203
205 DecimalUpDown To default Style και ControlTemplate Ο XAML κώδικας για το default Style και ControlTemplate φαίνεται παρακάτω. Μπορείτε να βασιστείτε σε αυτόν για να δημιουργήσετε μία μικρή ή μεγάλη παραλλαγή του δικού σας custom Style και ControlTemplate: xmlns:z="clr-namespace:zeus.wpf.controls.updowncontrols"> <Style TargetType="{x:Type z:decimalupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type z:decimalupdown}"> <ControlTemplate.Resources > <z:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> </ControlTemplate.Resources> <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard > <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Σελίδα 204
206 DecimalUpDown Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" /> <VisualState Name="Unfocused"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" > <Grid.RowDefinitions > <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- The width of the second Grid column is about for the RepeatButtons and depends on ButtonsWidth property --> <Grid.ColumnDefinitions > <ColumnDefinition Width="*" /> <ColumnDefinition Width="{Binding RelativeSource={Relative Source Mode=FindAncestor, AncestorType={x:Type z:decimalupdown}}, Path=ButtonsWidth, Converter={StaticResource doubletogridlengthconverter}}" /> </Grid.ColumnDefinitions> <TextBox Name="PART_Value" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> <Viewbox Stretch="Fill" Grid.Column="1"> <StackPanel Name="stkRepeatButtons" VerticalAlignment="Center" HorizontalAlignment="Left" Focusable="False"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> Σελίδα 205
207 DecimalUpDown </Style> </Grid> </Border> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </StackPanel> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Η δεύτερη στήλη του Grid περιέχει τα repeat buttons μέσα σε ένα StackPanel. To πλάτος της δεύτερης στήλης του Grid προσδιορίζεται με βάση την τιμή της ιδιότητας ButtonsWidth. Για να μετατραπεί η τιμή Double της ιδιότητας ButtonsWidth σε τιμή τύπου GridLength χρησιμοποιούμε μία κλάση μετατροπής τιμής (ValueConverter). Θα τη βρείτε στο Παράρτημα 2. Σελίδα 206
208 DecimalUpDown Παράδειγμα custom Style και ControlTemplate Στο επόμενο παράδειγμα, δημιουργούμε ένα custom Style και ControlTemplate. Συγκεκριμένα: Ορίζουμε ότι όταν λάβει την εστίαση, το background να γίνει κίτρινο. Αυτό γίνεται, θέτοντας στο Focused state το σχετικό Storyboard που περιέχει ένα ColorAnimation που κάνει animate το background color σε Yellow σε χρόνο 0.2 sec. Στη δομή του ControlTemplate, αλλάζουμε θέση στα up-down buttons. Το up-button βρίσκεται πάνω δεξιά από το TextBox ενώ το down-button βρίσκεται από κάτω δεξιά (3 γραμμές). Για να επιτευχθεί αυτό αλλάζει λίγο η διάταξη του Grid container, που τώρα περιέχει 3 RowDefinintions. Η λειτουργικότητα του control παραμένει η ίδια. Η εικόνα του custom DecimalUpDown σε κανονική κατάσταση - Normal state: Η εικόνα του custom DecimalUpDown όταν έχει την εστίαση - Focused state: Ο XAML κώδικας για το custom Style και ControlTemplate του παραπάνω DecimalUpDown είναι ο εξής: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncont rols" <Style TargetType="{x:Type zeus:decimalupdown}" > <Setter Property="Focusable" Value="True"/> <Setter Property="BorderBrush" Value="Black" /> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Background" Value="Transparent" /> <Setter Property="Width" Value ="120"/> <Setter Property="Height" Value="23"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type zeus:decimalupdown}"> <ControlTemplate.Resources > <zeus:doubletogridlengthconverter x:key="doubletogridlengthconverter"/> Σελίδα 207
209 DecimalUpDown </ControlTemplate.Resources> <!-- Root element --> <Border Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <VisualStateManager.VisualStateGroups > <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal"/> <VisualState Name="Disabled"> <Storyboard> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Background.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveBorderColorKey }}" /> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="Foreground.Color" > <DiscreteColorKeyFrame KeyTime="0" Value="{StaticResource {x:static SystemColors.InactiveCaptionColorKey }}" /> </ColorAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Value" Storyboard.TargetProperty ="(TextBox.FontWeight)" > <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding Source={x:Static FontWeights.Normal}}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup Name="FocusStates"> <VisualState Name="Focused" > <Storyboard > ColorAnimation Storyboard.TargetName="PART_Value" Storyboard.TargetProperty="Background.Color" To="Yellow" Duration="0:0:0.2"/> </Storyboard> </VisualState> <VisualState Name="Unfocused"/> </VisualStateGroup> Σελίδα 208
210 DecimalUpDown </Style> </VisualStateManager.VisualStateGroups> <!-- Content --> <Grid Name="mainGrid" Background="Transparent" Margin="{TemplateBinding Padding}"> <Grid.RowDefinitions > <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBox Name="PART_Value" Grid.Row="1" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment }" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment }" Background="{TemplateBinding Background }" Foreground="{TemplateBinding Foreground }" Padding="2,0,2,0" Validation.ErrorTemplate="{TemplateBinding ErrorTemplate}"> </TextBox> </Grid> </Border> <Viewbox Stretch="Uniform" Grid.Row="0" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementUp" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 1,10 10,1 20,10 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> <Viewbox Stretch="Uniform" Grid.Row="2" Height="12" HorizontalAlignment="Right"> <RepeatButton Name="PART_IncrementDown" Focusable="False" > <RepeatButton.Content> <Path Fill="Black" Stroke="Green" Data="M 10,10 1,1 20,1 Z" /> </RepeatButton.Content> </RepeatButton> </Viewbox> </ControlTemplate> </Setter.Value> </Setter> Σελίδα 209
211 UpDownControls για Ημερομηνιακά δεδομένα Ημερομηνίες Στα επόμενα, παρουσιάζονται τα UpDownControls για είσοδο ημερομηνιακών δεδομένων. DatePickerUpDown
212 DatePickerUpDown DatePickerUpDown Ένα UpDown control που επιτρέπει την είσοδο ημερομηνιακών δεδομένων, τύπου Nullable(of Date) ή Nullable(of DateTime). Η τιμή δεν απαιτείται (can be null). Σύνταξη: <TemplateVisualState(Name:="Normal", GroupName:="CommonStates"), TemplateVisualState(Name:="MouseOver", GroupName:="CommonStates"), TemplateVisualState(Name:="Disabled", GroupName:="CommonStates"), TemplateVisualState(Name:="Focused", GroupName:="FocusStates"), TemplateVisualState(Name:="Unfocused", GroupName:="FocusStates"), TemplatePart(Name:="PART_DatePicker", Type:=GetType(DatePicker)), TemplatePart(Name:="PART_IncrementUp", Type:=GetType(RepeatButton)), TemplatePart(Name:="PART_IncrementDown", Type:=GetType(RepeatButton))> <DefaultProperty("SelectedDate")> Public Class DatePickerUpDown Inherits UpDownBase XAML Object Element Usage: Εισαγωγή namespace: xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusupdowncontr ols" Χρήση: <zeus:datepickerupdown... /> Παράδειγμα: Στο παράδειγμα που ακολουθεί, τοποθετούμε ένα DatePickerUpDown μέσα σε ένα Grid ενός παραθύρου. Συνδέουμε την ιδιότητα SelectedDate με την ιδιότητα DateInsertionNullable, τύπου Nullable(Of Date), ενός Customer αντικειμένου (source object). H κλάση Customer ορίζεται στο project και συνεπώς πρέπει να εισάγουμε και το αντίστοιχο namespace με alias p. Επίσης, ορίζουμε ένα ErrorTemplate για το Validation (όπου μέσω αυτού θα εμφανιστεί το μήνυμα λάθους που ορίζουμε στην ιδιότητα ErrorMessageOnValueOutOfRange). Επιπλέον, ορίζουμε ένα Style, στοχευμένο στην κλάση UpDownBase, για την ομοιόμορφη εμφάνιση των UpDown controls στο παράθυρο. <Window x:class="mainwindow"
213 DatePickerUpDown xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock}"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> Σελίδα 212
214 DatePickerUpDown <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12.50"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Date Insertion (Nullable(Of Date)):" /> <zeus:datepickerupdown Name="dateInsertionUpDown" Width="180" Increment="1" IncrementType="Days" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="2/20/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Short" DatePickerWatermark="Επιλέξτε Ημερ/νία" Style="{StaticResource UpDownStyle}" SelectedDateChanged="dateInsertion_SelectedDateChanged" />... </Grid> </Window> Dim errtemplate As ControlTemplate = _ CType(Me.FindResource("validationErrorTemplate"), ControlTemplate) UpDown1.ErrorTemplate = errtemplate Για την κλάση Customer δείτε το Παράρτημα 1. Μία κανονική κατάσταση του DatePickerUpDown (culture "el", short format): Σελίδα 213
215 DatePickerUpDown Μία κανονική κατάσταση του DatePickerUpDown (culture "el", long format): Όταν δεν υπάρχει επιλεγμένη ημερομηνία, εμφανίζεται το empty watermark: Με ανεπτυγμένο το calendar. Οι ημερομηνίες 10/2/2018 και 18/2/2018 έχουν δηλωθεί ως blackout dates: Παρακάτω, βλέπουμε την ένδειξη λάθους όταν ο χρήστης εισάγει μία λανθασμένη (ως προς τo εύρος) τιμή. Αν πάει το δείκτη του ποντικιού πάνω στο θαυμαστικό θα εμφανιστεί το μήνυμα λάθους "The date is out of range. Please, retry!" Σελίδα 214
216 DatePickerUpDown Απαριθμήσεις Όνομα IncrementTypeEnum Περιγραφή Περιλαμβάνει τις τιμές για τον τύπο της βηματικής αυξομείωσης της ημερομηνίας στο control. Επηρεάζει το πώς "μεταφράζεται" η τιμής της ιδιότητας Increment. Σελίδα 215
217 DatePickerUpDown IncrementTypeEnum Καθορίζει τον τύπο της βηματικής αυξομείωσης της ημερομηνίας στο control. Σύνταξη: Public Enum IncrementTypeEnum Μέλη: Τιμή Days Months Years Περιγραφή Η αυξομείωση αφορά ημέρες. Η αυξομείωση αφορά μήνες. Η αυξομείωση αφορά έτη. Σελίδα 216
218 DatePickerUpDown Ιδιότητες Όνομα ButtonsWidth CalendarStyle DatePickerWatermark DisplayDate Περιγραφή Καθορίζει το πλάτος, σε pixels, των buttons αυξομείωσης του control. (Το ύψος είναι σταθερά ορισμένο στο μέσον του ύψους του control). (Κληρονομείται από την UpDownBase). Καθορίζει τo Style που θα χρησιμοποιηθεί για την εμφάνιση του ενσωματωμένου calendar. Καθορίζει το κείμενο που θα εμφανίζεται όταν δεν υπάρχει επιλεγμένη ημερομηνία (SelectedDate=Nothing ή Text=""). Καθορίζει την ημερομηνία που θα εμφανίζεται στο ενσωματωμένο calendar όταν δεν έχει επιλεγεί συγκεκριμένη ημερομηνία. Είναι τύπου Nullable(Of DateTime). Η default τιμή είναι Nothing. DisplayDateStart DisplayDateEnd ErrorMessageOnValueOutOfRange ErrorTemplate FirstDayOfWeek Καθορίζει την ημερομηνία αρχής που θα εμφανίζεται στο calendar, τύπου Nullable(Of DateTime). Λειτουργεί ως το ελάχιστο αποδεκτό όριο. Η default τιμή είναι Nothing. Καθορίζει την ημερομηνία τέλους που θα εμφανίζεται στο calendar, τύπου Nullable(Of DateTime). Λειτουργεί ως το μέγιστο αποδεκτό όριο. Η default τιμή είναι Nothing. Καθορίζει το μήνυμα λάθους που θα εμφανίζεται όταν ο χρήστης εισάγει τιμή που δεν είναι στο αποδεκτό εύρος (DisplayDateStart-DisplayDateEnd). (Κληρονομείται από την UpDownBase). Καθορίζει ένα ControlTemplate που θα εφαρμόζεται όταν το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Καθορίζει την ημέρα που θα θεωρείται ως πρώτη της εβδομάδας, τύπου System.DayOfWeek. Αυτή η ιδιότητα επηρεάζει την εμφάνιση του ενσωματωμένου calendar. H default τιμή είναι System.DayOfWeek.Monday. Σελίδα 217
219 DatePickerUpDown HasError Αν είναι True, τότε το control είναι σε κατάσταση λάθους. (Κληρονομείται από την UpDownBase). Increment IncrementType IsDropDownOpen Καθορίζει το βήμα αύξησης της τιμής στο control, τύπου Integer. H default τιμή είναι 1. Ο τύπος του βήματος μπορεί να είναι ημέρα/μήνας/έτος και εξαρτάται από την τιμή της ιδιότητας IncrementType. Καθορίζει τον τύπο του βήματος αύξησης της τιμής του control, τύπου IncrementTypeEnum. Η default τιμή είναι IncrementTypeEnum.Days. Καθορίζει αν το ενσωματωμένο calendar θα είναι ανοικτό ή κλειστό, τύπου Boolean. Η default τιμή είναι False. IsMinimum IsMaximum IsTodayHighlighted SelectedDate SelectedDateFormat Text Αν είναι True, τότε η τρέχουσα ημερομηνία έχει φτάσει στο ελάχιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα DisplayDateStart. (Κληρονομείται από την UpDownBase). Αν είναι True, τότε η τρέχουσα ημερομηνία έχει φτάσει στο μέγιστο όριο, όπως αυτό έχει προσδιοριστεί στην ιδιότητα DisplayDateEnd. (Κληρονομείται από την UpDownBase). Καθορίζει αν η σημερινή ημερομηνία θα είναι φωτισμένη στο ενσωματωμένο calendar, τύπου Boolean. Αυτή η ιδιότητα επηρεάζει την εμφάνιση του ενσωματωμένου calendar. Η default τιμή είναι True. Καθορίζει την επιλεγμένη ημερομηνία, τύπου Nullable(Of DateTime). Η default τιμή είναι Nothing. Καθορίζει την μορφή της επιλεγμένης ημερομηνίας στο control, τύπου DatePickerFormat. H default τιμή είναι DatePickerFormat.Short. Επιστρέφει το κείμενο της επιλεγμένης ημερομηνίας. Η default τιμή είναι ένα κενό string. Σελίδα 218
220 DatePickerUpDown CalendarStyle Καθορίζει το Style για το ενσωματωμένο calendar. Σύνταξη: Public Property CalendarStyle As Style Τύπος: System.Windows.Style Προσδιορίζουμε ένα αντικείμενο Style που θα χρησιμοποιηθεί για το rendering του ενσωματωμένου calendar. Dependency Property Information: Identifier field: CalendarStyleProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε ένα resource Style με όνομα redcalendarstyle και το εφαρμόζουμε στην ιδιότητα CalendarStyle. XAML <Window.Resources>... <!-- The Calendar style for the DatePickerUpDown --> <Style x:key="redcalendarstyle" TargetType="Calendar" > <Setter Property="Background" Value="LightCoral"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="5"/> </Style> </Window.Resources>... <zeus:datepickerupdown Name="dateInsertionUpDown" Grid.Row="2" Grid.Column="1" Margin="5,4,0,4" Increment="1" IncrementType="Days" Language="el" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="2/20/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Short" Style="{StaticResource UpDownStyle }" CalendarStyle="{StaticResource redcalendarstyle}" Σελίδα 219
221 DatePickerUpDown DatePickerWatermark="Επιλέξτε Ημερ/νία" HorizontalContentAlignment="Right" SelectedDateChanged="dateInsertion_SelectedDateChanged" /> Dim redcalendarstyle As New Style With {.TargetType = GetType(Calendar)} With redcalendarstyle.setters.add(new Setter With {.Property = Control.BackgroundProperty, _.Value = Brushes.LightCoral}).Add(New Setter With {.Property = Control.BorderBrushProperty, _.Value = Brushes.Red}).Add(New Setter With {.Property = Control.BorderThicknessProperty, _.Value = New Thickness(5)}) End With dateinsertionupdown.calendarstyle = redcalendarstyle Βλέπουμε το αποτέλεσμα: Σελίδα 220
222 DatePickerUpDown DatePickerWatermark Καθορίζει το κείμενο που θα εμφανίζεται όταν δεν υπάρχει επιλεγμένη ημερομηνία (SelectedDate=Nothing ή Text=""). Σύνταξη: Public Property DatePickerWatermark As String Τύπος: System.String Dependency Property Information: Identifier field: DatePickerWatermarkProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το watermark "Επιλέξτε Ημερ/νία" όταν δεν υπάρχει επιλεγμένη ημερομηνία. Έχουμε ορίσει ένα style για το DatePickerUpDown που βασίζεται σε αυτό του UpDownStyle και καλύπτει την περίπτωση που η ιδιότητα Text είναι κενή. Τότε ενεργοποιείται το style trigger και δίνει ένα ελαφρύ γκρι χρώμα στο watermark και μικρότερο μέγεθος γραμματοσειράς. <Window x:class="mainwindow" xmlns=" xmlns:x=" xmlns:d=" xmlns:mc=" xmlns:p="clr-namespace:updowncontrolstestproject" xmlns:zeus="clr-namespace:zeus.wpf.controls.updowncontrols;assembly=zeusup DownControls" mc:ignorable="d" Title="UpDownControls Sample Project" Height="350" Width="525" Loaded="Window_Loaded" > <Window.Resources> <!-- The Validation Error ControlTemplate --> <ControlTemplate x:key="validationerrortemplate"> <StackPanel Orientation="Horizontal"> <Border BorderBrush="#FFCB2E2E" BorderThickness="1" Background="#11FF0000" IsHitTestVisible="False" > <AdornedElementPlaceholder x :Name="placeholder" /> </Border> <Grid Margin="20,0,0,0" > Σελίδα 221
223 DatePickerUpDown <Ellipse Width="20" Height="20" Fill="Red" /> <TextBlock Foreground="White" FontSize="14" Text="!" FontWeight="ExtraBold" VerticalAlignment="Center" HorizontalAlignment="Center" /> <Grid.ToolTip> <TextBlock Text="{Binding Path=/ErrorContent}"/> </Grid.ToolTip> </Grid> </StackPanel> </ControlTemplate> <Style TargetType="{x:Type TextBlock}"> <Setter Property="FontSize" Value="14"/> <Setter Property="HorizontalAlignment" Value="Right" /> <Setter Property="Margin" Value="5"/> </Style> <!-- The style base for the UpDown controls. --> <Style x:key="updownstyle" TargetType="{x:Type zeus:updownbase }"> <Setter Property="FontSize" Value="14"/> <Setter Property="Background" Value="White"/> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Margin" Value="5,0,0,0"/> <Style.Triggers > <Trigger Property="IsMinimum" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="IsMaximum" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="White" /> </Trigger> <Trigger Property="HasError" Value="True"> <Setter Property="Foreground" Value="Red"/> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="2"/> </Trigger> </Style.Triggers> </Style> <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12.50"/> </Window.Resources> <Grid Margin="10,40,10,10" DataContext="{Binding Source={StaticResource customer}}">... <TextBlock Text="Date Insertion (Nullable(Of Date)):" /> <zeus:datepickerupdown Name="dateInsertionUpDown" Width="180" Σελίδα 222
224 DatePickerUpDown Increment="1" IncrementType="Days" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="2/20/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Short" DatePickerWatermark="Επιλέξτε Ημερ/νία" Style="{StaticResource UpDownStyle}" SelectedDateChanged="dateInsertion_SelectedDateChanged" />... </Grid> </Window> dateinsertionupdown.datepickerwatermark = "Επιλέξτε Ημερ/νία" Βλέπουμε το αποτέλεσμα: Σελίδα 223
225 DatePickerUpDown DisplayDate Καθορίζει την ημερομηνία που θα εμφανίζεται στο ενσωματωμένο calendar όταν δεν έχει επιλεγεί συγκεκριμένη ημερομηνία (SelectedDate=Nothing ή Text=""). Σύνταξη: Public Property DisplayDate As Nullable(Of DateTime) Τύπος: System.Nullable(Of DateTime) Dependency Property Information: Identifier field: DisplayDateProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε την ημερομηνία 13/4/2018 να εμφανίζεται στο calendar στην περίπτωση που δεν έχει επιλεγεί συγκεκριμένη ημερομηνία. XAML <zeus:datepickerupdown Name="dateInsertionUpDown" Width="18 Increment="1" IncrementType="Days" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="6/30/2018" DisplayDate="4/13/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Short" DatePickerWatermark="Επιλέξτε Ημερ/νία" Style="{StaticResource UpDownStyle}" SelectedDateChanged="dateInsertion_SelectedDateChanged" /> dateinsertionupdown.displaydate = #2/13/2018# Σελίδα 224
226 DatePickerUpDown DisplayDateStart Καθορίζει την ημερομηνία αρχής που θα εμφανίζεται στο calendar. Λειτουργεί ως το ελάχιστο αποδεκτό όριο. Σύνταξη: Public Property DisplayDateStart As Nullable(Of DateTime) Τύπος: System.Nullable(Of DateTime) Dependency Property Information: Identifier field: DisplayDateStartProperty Θέτοντας μία ημερομηνία, αυτή λειτουργεί ως το κάτω αποδεκτό όριο. Η default τιμή είναι Nothing (χωρίς ελάχιστο όριο). Παρατηρήσεις: Στο calendar οι ημερομηνίες ξεκινούν από αυτήν που θα θέσουμε εδώ. Παρόλα αυτά, ο χρήστης μπορεί να πληκτρολογήσει απ' ευθείας μία ημερομηνία που είναι κάτω από το αποδεκτό όριο. Τότε το control μπαίνει σε κατάσταση λάθους (HasError=True) και η ημερομηνία δεν γίνεται αποδεκτή. Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε την ημερομηνία αρχής την 1/2/2018 και ημερομηνία τέλους την 20/2/2018. XAML <zeus:datepickerupdown Name="dateInsertionUpDown" Width="18 Increment="1" IncrementType="Days" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="2/20/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Short" DatePickerWatermark="Επιλέξτε Ημερ/νία" Style="{StaticResource UpDownStyle}" SelectedDateChanged="dateInsertion_SelectedDateChanged" /> Σελίδα 225
227 DatePickerUpDown dateinsertionupdown.displaydatestart = #2/1/2018# dateinsertionupdown.displaydateend = #2/20/2018# ή dateinsertionupdown.displaydatestart = New DateTime(2018, 2, 1) dateinsertionupdown.displaydateend = New DateTime(2018, 2, 20) Βλέπουμε το αποτέλεσμα, όπου το calendar έχει περιοριστεί στο εύρος 1/2/2018 έως 20/2/2018: Αν ο χρήστης πληκτρολογήσει μία μη έγκυρη ημερομηνία το calendar θα επεκταθεί αλλά δεν θα κάνει αποδεκτή καμία ημερομηνία που είναι εκτός ορίων: Και το μήνυμα λάθους: Όταν ο χρήστης επιλέξει ή πληκτρολογήσει μία έγκυρη ημερομηνία τότε το calendar επανέρχεται στο αποδεκτό εύρος. Σελίδα 226
228 DatePickerUpDown DisplayDateEnd Καθορίζει την ημερομηνία τέλους που θα εμφανίζεται στο calendar. Λειτουργεί ως το μέγιστο αποδεκτό όριο. Σύνταξη: Public Property DisplayDateEnd As Nullable(Of DateTime) Τύπος: System.Nullable(Of DateTime) Dependency Property Information: Identifier field: DisplayDateEndProperty Θέτοντας μία ημερομηνία, αυτή λειτουργεί ως το άνω αποδεκτό όριο. Η default τιμή είναι Nothing (χωρίς μέγιστο όριο). Παρατηρήσεις: Στο calendar οι ημερομηνίες τελειώνουν σε αυτήν που θα θέσουμε εδώ. Παρόλα αυτά, ο χρήστης μπορεί να πληκτρολογήσει απ' ευθείας μία ημερομηνία που είναι πάνω από το αποδεκτό όριο. Τότε το control μπαίνει σε κατάσταση λάθους (HasError=True) και η ημερομηνία δεν γίνεται αποδεκτή. Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε την ημερομηνία αρχής την 1/2/2018 και ημερομηνία τέλους την 20/2/2018. XAML <zeus:datepickerupdown Name="dateInsertionUpDown" Width="18 Increment="1" IncrementType="Days" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="2/20/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Short" DatePickerWatermark="Επιλέξτε Ημερ/νία" Style="{StaticResource UpDownStyle}" SelectedDateChanged="dateInsertion_SelectedDateChanged" /> Σελίδα 227
229 DatePickerUpDown dateinsertionupdown.displaydatestart = #2/1/2018# dateinsertionupdown.displaydateend = #2/20/2018# ή dateinsertionupdown.displaydatestart = New DateTime(2018, 2, 1) dateinsertionupdown.displaydateend = New DateTime(2018, 2, 20) Βλέπουμε το αποτέλεσμα, όπου το calendar έχει περιοριστεί στο εύρος 1/2/2018 έως 20/2/2018: Αν ο χρήστης πληκτρολογήσει μία μη έγκυρη ημερομηνία το calendar θα επεκταθεί αλλά δεν θα κάνει αποδεκτή καμία ημερομηνία που είναι εκτός ορίων: Και το μήνυμα λάθους: Όταν ο χρήστης επιλέξει ή πληκτρολογήσει μία έγκυρη ημερομηνία τότε το calendar επανέρχεται στο αποδεκτό εύρος. Σελίδα 228
230 DatePickerUpDown FirstDayOfWeek Καθορίζει την ημέρα που θα θεωρείται ως πρώτη της εβδομάδας, Αυτή η ιδιότητα επηρεάζει την εμφάνιση του ενσωματωμένου calendar. Σύνταξη: Public Property FirstDayOfWeek As DayOfWeek Τύπος: System.DayOfWeek Dependency Property Information: Identifier field: FirstDayOfWeekProperty Η default τιμή είναι DayOfWeek.Monday. Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε την πρώτη ημέρα της εβδομάδας την Κυριακή. XAML <zeus:datepickerupdown Name="dateInsertionUpDown" Width="18 Increment="1" IncrementType="Days" Language="el" HorizontalContentAlignment="Right" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="2/20/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Short" DatePickerWatermark="Επιλέξτε Ημερ/νία" FirstDayOfWeek="Sunday" Style="{StaticResource UpDownStyle}" SelectedDateChanged="dateInsertion_SelectedDateChanged" /> dateinsertionupdown.firstdayofweek = DayOfWeek.Sunday Βλέπουμε το αποτέλεσμα: Σελίδα 229
231 DatePickerUpDown Σελίδα 230
232 DatePickerUpDown Increment Καθορίζει το βήμα αύξησης της τιμής στο control. Ο τύπος του βήματος μπορεί να είναι ημέρα/μήνας/έτος και εξαρτάται από την τιμή της ιδιότητας IncrementType. Σύνταξη: Public Property Increment As Integer Τύπος: System.Integer Προσδιορίζουμε μία θετική τιμή για το βήμα αύξησης της ημερομηνίας. H default τιμή είναι 1. Dependency Property Information: Identifier field: IncrementProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το βήμα αύξησης στο DatePickerUpDown σε 2. Επειδή η τιμή της ιδιότητας IncrementType είναι "Days", η αυξομείωση είναι ανά 2 ημέρες. XAML: <zeus:datepickerupdown Name="dateInsertionUpDown" Increment="2" IncrementType="Days"... /> dateinsertionupdown.increment = 2 Σελίδα 231
233 DatePickerUpDown IncrementType Καθορίζει τον τύπο του βήματος αύξησης της τιμής του control. Σύνταξη: Public Property IncrementType As IncrementTypeEnum Τύπος: DatePickerUpDown.IncrementTypeEnum Προσδιορίζουμε μία τιμή από την απαρίθμηση IncrementTypeEnum για τον τύπο αύξησης της ημερομηνίας (μέρα/μήνας/έτος). H default τιμή είναι IncrementTypeEnum.Days. Dependency Property Information: Identifier field: IncrementTypeProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε τον τύπο βήματος αύξησης στο DatePickerUpDown σε "Months". Αυτό σημαίνει ότι όποτε ο χρήστης κάνει κλικ σε κάποιο arrow button η μεταβολή είναι σε μήνες. Εδώ, η Increment = 1, άρα η αυξομείωση είναι ανά ένα μήνα. XAML: <zeus:datepickerupdown Name="dateInsertionUpDown" Increment="1" IncrementType="Months"... /> dateinsertionupdown.incrementtype = DatePickerUpDown.IncrementTypeEnum.Months Σελίδα 232
234 DatePickerUpDown IsDropDownOpen Καθορίζει αν το ενσωματωμένο calendar θα είναι ανοικτό ή κλειστό. Σύνταξη: Public Property IsDropDownOpen As Boolean Τύπος: System.Boolean H default τιμή είναι False. Dependency Property Information: Identifier field: IsDropDownOpenProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε το ενσωματωμένο calendar να είναι ανοικτό. XAML: <zeus:datepickerupdown Name="dateInsertionUpDown" Increment="1" IncrementType="Days" IsDropDownOpen="True"... /> dateinsertionupdown.isdropdownopen = True Σελίδα 233
235 DatePickerUpDown IsTodayHighlighted Καθορίζει αν η σημερινή ημερομηνία θα είναι φωτισμένη στο ενσωματωμένο calendar. Σύνταξη: Public Property IsTodayHighlighted As Boolean Τύπος: System.Boolean H default τιμή είναι True. Dependency Property Information: Identifier field: IsTodayHighlightedProperty Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε η σημερινή ημερομηνία να μην είναι φωτισμένη στο ενσωματωμένο calendar. XAML: <zeus:datepickerupdown Name="dateInsertionUpDown" Increment="1" IncrementType="Days" IsTodayHighlighted="False"... /> dateinsertionupdown.istodayhighlighted = False Σελίδα 234
236 DatePickerUpDown SelectedDate Καθορίζει την επιλεγμένη ημερομηνία. Σύνταξη: Public Property SelectedDate As Nullable(Of DateTime) Τύπος: System.Nullable(Of DateTime) Dependency Property Information: Identifier field: SelectedDateProperty Παρατηρήσεις: Η ιδιότητα αυτή λαμβάνει από τον χρήστη την επιλεγείσα ημερομηνία. Γι' αυτό το λόγο, πρέπει να συνδέεται μέσω Binding με την ιδιότητα μίας πηγής δεδομένων (source object). Παράδειγμα: Στο παράδειγμα που ακολουθεί συνδέουμε την ιδιότητα SelectedDate με την ιδιότητα DateInsertionNullable, τύπου Nullable(Of Date), ενός Customer αντικειμένου (source object). Η μορφή της ημερομηνίας καθορίζεται στην ιδιότητα SelectedDateFormat, που εδώ είναι Long. XAML <Window.Resources>... <!-- A sample Customer resource object for the Bindings --> <p:customer x:key="customer" LastName="Mouratidis" FirstName="Christos" Amount1="12.50"/> </Window.Resources> <zeus:datepickerupdown Name="dateInsertionUpDown" Increment="1" IncrementType="Days" Language="el" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="2/20/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Long"... /> Σελίδα 235
237 DatePickerUpDown Η αλλαγή θα γίνει στο source object (με όνομα customer), οπότε μέσω του binding θα περάσει στην ιδιότητα SelectedDate : CType(Me.FindResource("customer"), Customer).DateInsertionNullable = #2/8/2018# Βλέπουμε το αποτέλεσμα όταν ο χρήστης επιλέγει την 8/2/2018: Σελίδα 236
238 DatePickerUpDown SelectedDateFormat Καθορίζει την μορφή της επιλεγμένης ημερομηνίας στο control. Σύνταξη: Public Property SelectedDateFormat As DatePickerFormat Τύπος: System.Windows.Controls.DatePickerFormat Dependency Property Information: Identifier field: SelectedDateFormatProperty Η default τιμή είναι DatePickerFormat.Short. Παρατηρήσεις: Οι δυνατές τιμές είναι DatePickerFormat.Short (default) και DatePickerFormat.Long. Παράδειγμα: Στο επόμενο παράδειγμα, καθορίζουμε την μορφή της επιλεγμένης ημερομηνίας σε DatePickerFormat.Long. XAML <zeus:datepickerupdown Name="dateInsertionUpDown" Increment="1" IncrementType="Days" Language="el" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="2/20/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Long"... /> dateinsertionupdown.selecteddateformat = DatePickerFormat.Long Βλέπουμε το αποτέλεσμα: Σελίδα 237
239 DatePickerUpDown dateinsertionupdown.selecteddateformat = DatePickerFormat.Short Σελίδα 238
240 DatePickerUpDown Text Επιστρέφει το κείμενο της επιλεγμένης ημερομηνίας. Αν δεν υπάρχει επιλεγμένη ημερομηνία επιστρέφει ένα κενό string. Σύνταξη: Public Property Text As String Τύπος: System.String Dependency Property Information: Identifier field: TextProperty Παρατηρήσεις: Αν δεν υπάρχει επιλεγμένη ημερομηνία τότε επιστρέφει ένα κενό string, κάτι που μπορούμε να χρησιμοποιήσουμε σε ένα style trigger για να μορφοποήσουμε το watermark (σχετικό παράδειγμα υπάρχει στην ιδιότητα DatePickerWatermark). Σελίδα 239
241 DatePickerUpDown Συμβάντα Όνομα SelectedDateChanged Περιγραφή Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα SelectedDate. Σελίδα 240
242 DatePickerUpDown SelectedDateChanged Ενεργοποιείται όταν αλλάζει τιμή η ιδιότητα SelectedDate. Σύνταξη: VB (ορισμός): Public Custom Event SelectedDateChanged As RoutedPropertyChangedEventHandler(Of Nullable(Of DateTime)) XAML attribute usage: <zeus:datepickerupdown SelectedDateChanged="eventHanlder"... /> Παράδειγμα: Στο επόμενο παράδειγμα, έχουμε τοποθετήσει κάτω από το DatePickerUpDown ένα Slider. Το τελευταίο παίρνει τιμές από το 1 μέχρι το 20 (όσες είναι και οι αποδεκτές ημέρες στο DatePickerUpDown). Θέλουμε σε κάθε αλλαγή ημερομηνίας να μετατοπίζεται ο δείκτης του Slider στο κατάλληλο σημείο (Tick). Για παράδειγμα, αν ο χρήστης επιλέξει την 6/2/2018 τότε ο δείκτης του Slider πρέπει να πάει στην 6η θέση. Αν και αυτές τις συνδέσεις στο WPF συνηθίζουμε να τις πετυχαίνουμε με Bindings, εδώ θα καταδείξουμε τον κλασσικό τρόπο μέσω του eventhandler για το συμβάν SelectedDateChanged: XAML <zeus:datepickerupdown Name="dateInsertionUpDown" Grid.Row="2" Grid.Column="1" Margin="5,4,0,4" Width="150" Increment="1" IncrementType="Days" Language="el" ErrorMessageOnValueOutOfRange = "The date is out of range. Please, retry!" DisplayDateStart="2/1/2018" DisplayDateEnd="2/20/2018" SelectedDate="{Binding DateInsertionNullable}" SelectedDateFormat="Long" SelectedDateChanged="dateInsertion_SelectedDateChanged"... /> <Slider Name="sldDateDistance" Grid.Row="3" Grid.Column="1" TickFrequency="1" Minimum="1" Maximum ="20" HorizontalAlignment="Left" Width="150" Margin="0,5,0,0"/> Private Sub dateinsertion_selecteddatechanged(sender As Object, _ e As RoutedPropertyChangedEventArgs(Of Date?)) Dim dtupdown As DatePickerUpDown = TryCast(sender, DatePickerUpDown) Σελίδα 241
243 DatePickerUpDown End Sub If dtupdown IsNot Nothing Then End If If e.newvalue IsNot Nothing Then slddatedistance.value = _ (CDate(e.NewValue).Day - dtupdown.displaydatestart.value.day) + 1 End If Βλέπουμε το αποτέλεσμα όταν ο χρήστης επιλέξει την 6/2/2018: Σελίδα 242
244 DatePickerUpDown Μέθοδοι Όνομα AddBlackoutDates (List(Of CalendarDateRange), Optional Boolean) RemoveBlackoutDates (List(Of CalendarDateRange)) Περιγραφή Προσθέτει μία λίστα ημερομηνιών ως μη επιλέξιμες στο ενσωματωμένο calendar του control. Προαιρετικά, μπορούμε να καθορίσουμε να προστεθούν αυτόματα και όλες οι παρελθούσες ημερομηνίες. Ως τέτοιες θεωρούνται αυτές πρίν την σημερινή (today). Αφαιρεί μία λίστα ημερομηνιών από τις μη επιλέξιμες του ενσωματωμένου calendar του control. Οι ημερομηνίες αυτές πλέον μπορούν να επιλεγούν ξανά από το calendar. ClearBlackoutDays() Καθαρίζει τις μη επιλέξιμες ημερομηνίες του ενσωματωμένου calendar του control. Πλέον, όλες οι αποδεκτές ημερομηνίες μπορούν να επιλεγούν ξανά από το calendar. Σελίδα 243
245 DatePickerUpDown AddBlackoutDates Προσθέτει μία λίστα ημερομηνιών ως μη επιλέξιμες στο ενσωματωμένο calendar του control. Προαιρετικά, μπορούμε να καθορίσουμε να προστεθούν αυτόματα και όλες οι παρελθούσες ημερομηνίες. Ως τέτοιες θεωρούνται αυτές πρίν την σημερινή (today). Σύνταξη: VB : Public Sub AddBlackoutDates( listblackoutdates As List(Of CalendarDateRange), Optional adddaysinpast As Boolean = False ) Παράμετροι: listblackoutdates Τύπος: List(Of CalendarDateRange) Μία λίστα των ημερομηνιών που θα είναι μη επιλέξιμες στο ενσωματωμένο calendar. adddaysinpast (optional) Τύπος: Boolean Αν θέσουμε True τότε θα προστεθούν ως μη επιλέξιμες και όλες οι ημερομηνίες πριν τη σημερινή (today). Παράδειγμα: Στο επόμενο παράδειγμα, προσθέτουμε τις ημερομηνίες 10/2/2018 και 18/2/2018 στη λίστα των μη επιλέξιμων: Dim lstblackoutdays As New List(Of CalendarDateRange) With lstblackoutdays End With.AddRange({New CalendarDateRange(New Date(2018, 2, 10)), New CalendarDateRange(New Date(2018, 2, 18))}) dateinsertionupdown.addblackoutdates(lstblackoutdays) Βλέπουμε το αποτέλεσμα: Σελίδα 244
246 DatePickerUpDown Σελίδα 245
Zeus ColorControls Ver Manual
Zeus ColorControls Ver. 1.0 Manual Copyright 2018 Χρήστος Μουρατίδης Σελίδα 0 Zeus ColorControls ZEUS COLORCONTROLS VERSION 1.0... 2 ΟΙ ΟΡΙΣΜΟΙ ΤΩΝ ΚΛΑΣΕΩΝ... 4 ΔΙΑΝΟΜΗ... 5 ΕΠΙΚΟΙΝΩΝΙΑ... 6 COLORSWATCHHTML16...
Zeus RelayCommand Ver. 1.0
Zeus RelayCommand Ver. 1.0 Manual Copyright 2018 Χρήστος Μουρατίδης Zeus RelayCommand ZEUS RELAYCOMMAND VERSION 1.0... 2 Ο ΟΡΙΣΜΟΣ ΤΗΣ ΚΛΑΣΗΣ... 3 ΔΙΑΝΟΜΗ... 4 ΕΠΙΚΟΙΝΩΝΙΑ... 5 ΠΑΡΑΔΕΙΓΜΑ ΧΡΗΣΗΣ... 6 Η
Σχεδόν όλες οι ιστοσελίδες βασίζονται σε μεγάλο βαθμό σε πίνακες. Για να εισάγουμε έναν πίνακα επιλέγουμε από το μενού Insert->Table.
DreamWeaver - Άσκηση 4η Πίνακες Παρακάτω θα δούμε πως μπορούμε να δημιουργούμε και να επεξεργαζόμαστε πίνακες, μια πολύ βασική δομή. Θα δούμε πως γίνεται εισαγωγή πίνακα, ένωση κελιών του πίνακα, προσθήκη
ΤΕΙ ΗΠΕΙΡΟΥ ΣΧΟΛΗ: Τεχνολογικών Εφαρμογών ΤΜΗΜΑ: Μηχανικών Πληροφορικής Τ.Ε.
ΤΕΙ ΗΠΕΙΡΟΥ ΣΧΟΛΗ: Τεχνολογικών Εφαρμογών ΤΜΗΜΑ: Μηχανικών Πληροφορικής Τ.Ε. ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΘΕΜΑ: «ΑΝΑΠΤΥΞΗ ΠΡΟΓΡΑΜΜΑΤΟΣ ΓΡΑΜΜΑΤΕΙΑΚΗΣ ΥΠΟΣΤΗΡΙΞΗΣ ΓΙΑ ΣΧΟΛΗ ΟΔΗΓΩΝ ΣΕ C#» ΟΝΟΜΑΤΕΠΩΝΥΜΟ: Βασιλάκης Σταύρος
Γ3.3.Μ7 ΕΠΑΝΆΛΗΨΗ ΜΈΡΟΣ Α: ΈΝΝΟΙΕΣ ΤΙ ΕΊΝΑΙ Η VISUAL BASIC ΤΙ ΜΠΟΡΟΎΜΕ ΝΑ ΚΆΝΟΥΜΕ ΜΕ ΤΗ VISUAL BASIC ΑΝΤΙΚΕΊΜΕΝΑ: ΦΌΡΜΑ ΚΑΙ ΧΕΙΡΙΣΤΉΡΙΑ ΕΤΙΚΈΤΑ LABEL
Γ3.3.Μ7 ΕΠΑΝΆΛΗΨΗ ΜΈΡΟΣ Α: ΈΝΝΟΙΕΣ ΤΙ ΕΊΝΑΙ Η VISUAL BASIC Η Visual Basic είναι μια γλώσσα προγραμματισμού οδηγούμενη από συμβάντα που έχει ένα ολοκληρωμένο περιβάλλον ανάπτυξης Έχει δημιουργηθεί από τη
Γράψιμο και Διάβασμα σε φύλλο του Excel
Γράψιμο και Διάβασμα σε φύλλο του Excel Το παρακάτω παράδειγμα γράφει και διαβάζει πληροφορίες σε αρχείο του Excel (workbook). Το απλοϊκό παράδειγμά μας αφορά ένα βιβλιοπωλείο που κρατά, για κάθε βιβλίο,
Στην τεχνολογία των CSS, οι κανόνες στυλ (style
Δικτυακά Πολυμέσα ΙΙ Εργαστήριο #4 0 : CSS: Βασικές και προχωρημένες τεχνικές επιλογής, τα στοιχεία και , ψευδο κλάσεις και ψευδο επιλογείς Γαβαλάς Δαμιανός dgavalas@aegean.gr CSS κανόνες στυλ
3D FLASH ANIMATOR (3DFA)
3D FLASH ANIMATOR (3DFA) Εισαγωγή Τα βασικά στοιχεία του προγράµµατος 3DFA είναι οι ταινίες (movies), τα στοιχεία (elements), τα keyframes, τα γεγονότα (events) και οι ενέργειες (actions). Ταινίες (movies)
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Προγραμματισμός Η/Υ Ενότητα 2 η : Η Γλώσσα Προγραμματισμού VB.NET (1 ο Μέρος) Ι. Ψαρομήλιγκος Χ. Κυτάγιας Τμήμα Λογιστικής & Χρηματοοικονομικής
ΓΡΑΦΙΚΕΣ ΠΑΡΑΣΤΑΣΕΙΣ ΜΕ ΕXCEL
ΓΡΑΦΙΚΕΣ ΠΑΡΑΣΤΑΣΕΙΣ ΜΕ ΕXCEL 1. Εισαγωγή δεδομένων σε φύλλο εργασίας του Microsoft Excel Για να τοποθετήσουμε τις μετρήσεις μας σε ένα φύλλο Excel, κάνουμε κλικ στο κελί στο οποίο θέλουμε να τοποθετήσουμε
Αναμόρφωση της σχεδίασης γραφικών εξομοίωσης του προγράμματος NEAPOLIS με βάση τις. αναμενόμενες μεσες τιμ ες από τα μοντέλα μόνιμης κατάστασης
ι 3 ϋ f g ^ΞΞΞΞ 'J3 J ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΑΒΑΛΑΣ ΤΜΗΜΑ ΒΙΟ ΜΗΧΑΝΙΚΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Αναμόρφωση της σχεδίασης γραφικών εξομοίωσης του προγράμματος NEAPOLIS με βάση τις r r r r r a r αναμενόμενες
ΟΔΗΓΙΕΣ ΔΗΜΙΟΥΡΓΙΑΣ ΕΦΑΡΜΟΓΗΣ ΔΙΑΧΕΙΡΙΣΗΣ ΑΜΕΣΟΥ ΑΡΧΕΙΟΥ ΣΕ ΠΕΡΙΒΑΛΛΟΝ VISUAL STUDIO NET
1. Ανοίξτε το πρόγραμμα Microsoft Visual Studio Net 2. Στην start page επιλέξτε my profile 3. Στο πεδίο profile επιλέξτε visual basic developer και κλείστε την start page 4. Επιλέξτε File New Project 5.
ΜΑΘΗΜΑ Στοίχιση Παραγράφων. 2. Εσοχές Παραγράφων ΣΤΟΧΟΙ:
ΜΑΘΗΜΑ 4 ΣΤΟΧΟΙ: 1. Στοίχιση Παραγράφων 2. Εσοχές Παραγράφων 3. Διάστημα Μεταξύ Γραμμών (Διάστιχο) 4. Απόσταση Μεταξύ Παραγράφων 5. Καθορισμός Στηλοθετών (Tabs) 6. Μετακίνηση Στηλοθετών 7. Διαγραφή Στηλοθετών
Access 2. Φτιάχνοντας μια DB, πίνακες και εισαγωγή εξωτερικών δεδομένων
Access 2 Φτιάχνοντας μια DB, πίνακες και εισαγωγή εξωτερικών δεδομένων Στόχοι Σχεδιασμός βάσεων δεδομένων και τη ρύθμιση ιδιοτήτων πεδίων Προβάλετε και τροποποιήστε τους τύπους δεδομένων πεδίων και τη
Η Βίβλος των CSS - Μέρος 3 Το Box Model, τα Περιθώρια και τα Περιγράμματα
Η Βίβλος των CSS - Μέρος 3 Το Box Model, τα Περιθώρια και τα Περιγράμματα Το Box Model Το box model στα CSS περιγράφει τα πλαίσια (boxes) που δημιουργούνται για τα στοιχεία (elements) της HTML. Το box
Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010
Τμήμα Πληροφορικής & Επικοινωνιών Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010 Ιωάννης Γεωργουδάκης - Πάρις Μαστοροκώστας Σεπτέμβριος 2011 ΠΕΡΙΕΧΟΜΕΝΑ
Οδηγίες για εισαγωγή Photo Gallery σε Ιστοσελίδα με το SharePoint Designer 2007
Οδηγίες για εισαγωγή Photo Gallery σε Ιστοσελίδα με το SharePoint Designer 2007 Το πρόγραμμα Share Point Designer 2007 παρέχει την δυνατότητα να εισάγουμε Συλλογή φωτογραφιών, οι οποίες προβάλλονται με
Cascading Style Sheets (CSS)
Cascading Style Sheets (CSS) Τα Cascading Style Sheets προσφέρουν έναν εύκολο τρόπο για να ορίσουμε τη μορφοποίηση που επιθυμούμε να έχουν οι σελίδες μία τοποθεσίας του Παγκόσμιου Ιστού που δημιουργούμε.
Επεξεργασία πολλαπλών φύλλων εργασίας - Γραφημάτων Excel
Επεξεργασία πολλαπλών φύλλων εργασίας - Γραφημάτων Excel 11.1. Πολλαπλά φύλλα εργασίας Στο προηγούμενο κεφάλαιο δημιουργήσαμε ένα φύλλο εργασίας με τον προϋπολογισμό δαπανών του προσωπικού που θα συμμετάσχει
Σύστημα για την παρακολούθηση και διαχείριση έργων
ΕΘΝΙΚΌ ΜΕΤΣΌΒΙΟ ΠΟΛΥΤΕΧΝΕΊΟ ΣΧΟΛΉ ΗΛΕΚΤΡΟΛΌΓΩΝ ΜΗΧΑΝΙΚΏΝ ΚΑΙ ΜΗΧΑΝΙΚΏΝ ΥΠΟΛΟΓΙΣΤΏΝ ΤΟΜΈΑΣ ΗΛΕΚΤΡΙΚΏΝ ΒΙΟΜΗΧΑΝΙΚΏΝ ΔΙΑΤΆΞΕΩΝ ΚΑΙ ΣΥΣΤΗΜΆΤΩΝ ΑΠΟΦΆΣΕΩΝ Σύστημα για την παρακολούθηση και διαχείριση έργων ΔΙΠΛΩΜΑΤΙΚΗ
Διάλεξη 2η Εισαγωγή στο CSS
Διάλεξη 2η Εισαγωγή στο CSS Στέλιος Μόσχογλου Θεοδόσης Σουργκούνης Αντώνης Χρυσόπουλος I S S E L D e c o d e (Intelligent Systems & Software Engineering Lab) Στόχος της ώρας Τι είναι το CSS? Γιατί να χρησιμοποιήσω
ΜICROSOFT VISUAL STUDIO 2008. Eργ 1: Ανάπτυξη απλής εφαρµογής: Solutions, Projects, GUI, Events, Debugging. Εισαγωγή
ΜICROSOFT VISUAL STUDIO 2008 Eργ 1: Ανάπτυξη απλής εφαρµογής: Solutions, Projects, GUI, Events, Debugging Εισαγωγή Visual Basic 2008 Eργαλείο ανάπτυξης εντυπωσιακών εφαρµογών στα Windows, στο Web, φορητά
Τα αντικείμενα ή Χειριστήρια και οι βασικές ιδιότητες τους (properties)
Καθηγητής : Κώστας Αχιλλέως ΒΑΣΙΚΕΣ ΣΗΜΕΙΩΣΕΙΣ ΓΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΣΤΗ VISUAL BASIC A ΛΥΚΕΙΟΥ ΚΑΤΕΥΘΥΝΣΗΣ Α) Τι είναι η Visual Basic Είναι μια γλώσσα οπτικού προγραμματισμού υψηλού επιπέδου. Β) Οπτικός
Πώς εκτυπώνουμε μία λίστα εγγραφών από μία Access database (γενικός τρόπος)
Πώς εκτυπώνουμε μία λίστα εγγραφών από μία Access database (γενικός τρόπος) Το προηγούμενο tip αναφέρεται στην εκτύπωση με γραμματοσειρά σταθερού πλάτους. Στο παρόν, θα δούμε έναν γενικό τρόπο εκτύπωσης
Visual Basic Βασικές Έννοιες
Visual Basi Βασικές Έννοιες «Είδα στον ύπνο µου ότι η ζωή είναι χαρά. Ξύπνησα και είδα ότι είναι χρέος. Αγωνίστηκα και είδα ότι τo χρέος είναι χαρά.» Ραµπριτανάθ Ταγκόρ Κουλλάς Χρίστος www.oullas.om oullas
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να καταλάβουν την διαφορά ανάμεσα σε τοπικές και καθολικές μεταβλητές. Nα κάνουν αποσφαλμάτωση
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Προγραμματισμός Η/Υ Ενότητα 8 η : Αντικείμενα για εισαγωγή & επεξεργασία κειμένου (TextBox, RichTextBox, MaskedTextBox) Ι. Ψαρομήλιγκος
Αντικειμενοστρεφής Προγραμματισμός
Αντικειμενοστρεφής Προγραμματισμός Διδάσκουσα: Αναπλ. Καθηγήτρια Ανδριάνα Πρέντζα aprentza@unipi.gr Εργαστηριακός Συνεργάτης: Δρ. Βασιλική Κούφη vassok@unipi.gr Περιεχόμενα Java Classes Java Objects Java
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να αναπτύξουν ένα πρόγραμμα όπου θα επαναλάβουν τα βήματα ανάπτυξης μιας παραθυρικής εφαρμογής.
Άσκηση 1 (α) Να διατυπώσετε την πιο κάτω λογική έκφραση στη Visual Basic κάνοντας χρήση μεταβλητών:
Άσκηση 1 (α) Να διατυπώσετε την πιο κάτω λογική έκφραση στη Visual Basic κάνοντας χρήση μεταβλητών: (Μον.2) Η ηλικία είναι μεταξύ των 15 και 18 συμπεριλαμβανομένων (β) Αν Χ= 4, Υ=2, Κ=2 να βρείτε το αποτέλεσμα
Προγραμματισμός και Εφαρμογές Υπολογιστών
Προγραμματισμός και Εφαρμογές Υπολογιστών Ενότητα 2: Τύποι δεδομένων, θεμελιώδεις και οριζόμενοι από τον χρήστη Τμήμα: Αγροτικής Οικονομίας & Ανάπτυξης Διδάσκων: Κ.Π. Γιαλούρης Μαθησιακοί Στόχοι 1/2 Εξοικείωση
Σε αυτό το μάθημα θα ασχοληθούμε με τη βελτίωση της εμφάνισης ενός ιστοτόπου, αλλά και τον εύκολο χειρισμό όλων των αλλαγών τις οποίες επιθυμούμε να
Σε αυτό το μάθημα θα ασχοληθούμε με τη βελτίωση της εμφάνισης ενός ιστοτόπου, αλλά και τον εύκολο χειρισμό όλων των αλλαγών τις οποίες επιθυμούμε να κάνουμε μέσω ενός εξωτερικού αρχείου.το αρχείο αυτό
ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07
ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07 Αριθμητική στο δυαδικό σύστημα (γενικά) Συμπληρωματικά για δυαδικό σύστημα Η πρόσθεση στηρίζεται στους κανόνες: 0 + 0 = 0, 0 + 1 = 1, 1
Σημασιολογικός Ιστός (Semantic Web) - XML
Πανεπιστήμιο Πειραιώς Τμήμα Ψηφιακών Συστημάτων Σημασιολογικός Ιστός (Semantic Web) - XML 22/11/2016 Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια aprentza@unipi.gr Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων
Είσοδος Έξοδος - Μεταβλητές
Προγραμματισμός & Εφαρμογές Υπολογιστών: Visual Basic 6.0 Μάθημα 2 Είσοδος Έξοδος - Μεταβλητές Κ. Κωστοπούλου Αθήνα, Μάρτιος 2015 Τα βήματα του κύκλου ανάπτυξης ενός προγράμματος 1. Αποφασίζουμε τι θέλουμε
VBA ΣΤΟ WORD. 1. Συχνά, όταν ήθελα να δώσω ένα φυλλάδιο εργασίας με ασκήσεις στους μαθητές έκανα το εξής: Version 25-7-2015 ΗΜΙΤΕΛΗΣ!!!!
VBA ΣΤΟ WORD Version 25-7-2015 ΗΜΙΤΕΛΗΣ!!!! Μου παρουσιάστηκαν δύο θέματα. 1. Συχνά, όταν ήθελα να δώσω ένα φυλλάδιο εργασίας με ασκήσεις στους μαθητές έκανα το εξής: Εγραφα σε ένα αρχείο του Word τις
Εργαστήριο 2 - Άσκηση - Ανάλυση
Εργαστήριο 2 - Άσκηση - Ανάλυση Εκφώνηση: Δημιουργείστε την εφαρμογή Αριθμήτηριο σε Java Swing με χρήση NetBeans ακολουθώντας τις παρακάτω οδηγίες. 1. Η εφαρμογή θα σχεδιασθεί σε ένα εξωτερικό υποδοχέα
Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης
Η συνάρτηση printf() Η συνάρτηση printf() χρησιμοποιείται για την εμφάνιση δεδομένων στο αρχείο εξόδου stdout (standard output stream), το οποίο εξ ορισμού συνδέεται με την οθόνη Η συνάρτηση printf() δέχεται
2.9 ΛΑΒΕΣ 2.10 ΙΔΙΟΤΗΤΕΣ ΑΝΤΙΚΕΙΜΕΝΩΝ Layers. Command Line: Layer ή La ΟΙ ΘΕΣΕΙΣ ΤΩΝ GRIPS
2.9 ΛΑΒΕΣ Τα Grips (λαβές) είναι ένας μηχανισμός επεξεργασίας άμεσος και γρήγορος για να εκτελέσουμε τις πιο συνηθισμένες εντολές επεξεργασίας. Εμφανίζονται αν επιλέξουμε τα αντικείμενα χωρίς να έχουμε
Αντικειμενοστρεφής Προγραμματισμός
Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Αντικειμενοστρεφής Προγραμματισμός 3/4/2017 Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια aprentza@unipi.gr Γιατί έλεγχος πρόσβασης? Προστασία ιδιωτικής πληροφορίας
1. <body> 2. <header> 3. <h1> My Page </h1> 4. </header> 5. <section>
Ενδεικτικές ερωτήσεις 1. Τι σημαίνουν τα αρχικά CSS 2. Τι σημαίνουν τα αρχικά HTML 3. Ποια η διαφορά μεταξύ Internet και Web; a. Είναι το ίδιο b. Το Web είναι μια υπηρεσία του διαδικτύου 4. Ποια η διαφορά
Θέματα Προγραμματισμού Διαδικτύου ~ CSS ~
Θέματα Προγραμματισμού Διαδικτύου ~ CSS ~ Στελιος Σφακιανάκης Εαρινό 2019 Αυτή η εργασία χορηγείται με άδεια Creative Commons Αναφορά Δημιουργού - Μη Εμπορική Χρήση - Παρόμοια Διανομή 1 Εισαγωγή στο CSS
Πώς εκτυπώνουμε μία λίστα από εγγραφές μίας Access database
Πώς εκτυπώνουμε μία λίστα από εγγραφές μίας Access database Στο παρόν παράδειγμα, θα δούμε πώς εκτυπώνουμε έναν κατάλογο με συγκεκριμένα στοιχεία μαθητών, με γραμματοσειρά σταθερού πλάτους. Δηλαδή, θα
Εισαγωγή στο MATLAB. Κολοβού Αθανασία, ΕΔΙΠ,
Εισαγωγή στο MATLAB Κολοβού Αθανασία, ΕΔΙΠ, akolovou@di.uoa.gr Εγκατάσταση του Matlab Διανέμεται ελεύθερα στα μέλη του ΕΚΠΑ το λογισμικό MATLAB με 75 ταυτόχρονες (concurrent) άδειες χρήσης. Μπορείτε να
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται και τυπώνει τη θέση του.
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Προγραμματισμός Η/Υ Ενότητα 9 η : Αντικείμενα για επιλογή τιμής (CheckBox, RadioButton) & το αντικείμενο ομαδοποίησης GroupBox
Αρχιτεκτονική υπολογιστών
1 Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου Αρχιτεκτονική υπολογιστών Ενότητα 9 : Ομάδες Εντολών: Ιδιότητες και Λειτουργίες Ευάγγελος Καρβούνης Παρασκευή, 15/01/2016 Τι είναι ομάδα εντολών;
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να αναπτύξουν ένα πρόγραμμα όπου θα επαναλάβουν τα βήματα ανάπτυξης μιας παραθυρικής εφαρμογής.
ΟΔΗΓΙΕΣ ΕΓΚΑΤΑΣΤΑΣΗΣ ΚΑΙ ΧΕΙΡΙΣΜΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ WINLABEL
ΟΔΗΓΙΕΣ ΕΓΚΑΤΑΣΤΑΣΗΣ ΚΑΙ ΧΕΙΡΙΣΜΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ WINLABEL ΕΥΡΕΤΗΡΙΟ Εισαγωγή Στο Πρόγραμμα Διαχείριση Ετικετών 1. ΕΚΚΙΝΗΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ 2. ΕΓΚΑΤΑΣΤΑΣΗ ΕΚΤΥΠΩΤΗ 3. ΔΗΜΙΟΥΡΓΙΑ ΠΡΩΤΗΣ ΕΤΙΚΕΤΑΣ 4. ΑΠΟΘΗΚΕΥΣΗ
Πρόσθεση + Αφαίρεση - Πολλαπλασιασμός * Διαίρεση / Πηλίκο \ Υπόλοιπο Δύναμη
Σαχπατζίδης Αβραάμ Καθηγητής Πληροφορικής Π.Ε 20 Master of Arts (M.A) in "Gender, New Forms of Education, New Forms of Employment and New Technologies in the Information Age". Μαθηματικές Πράξεις στην
Φύλλο Εργασίας: Παιχνίδι Λαβύρινθος (MAZE) Προγραμματιστικό Εργαλείο: GAME MAKER. Ονοματεπώνυμο:
Φύλλο Εργασίας: Παιχνίδι Λαβύρινθος (MAZE) Προγραμματιστικό Εργαλείο: GAME MAKER Ονοματεπώνυμο: Τμήμα: Σκοπός σας είναι να φτιάξετε ένα ηλεκτρονικό παιχνίδι για περιπλάνηση σε Λαβύρινθο (MAZE) χρησιμοποιώντας
Σχήµα 4.1: Εισαγωγή βρόγχου while-loop.
Ο βρόγχος While-loop 1. Ο βρόγχος while-loop εκτελείται έως ότου ικανοποιηθεί µία προκαθορισµένη συνθήκη. 2. Ο αριθµός των επαναλήψεων ενός βρόγχου while-loop δεν είναι εκ των προτέρων προκαθορισµένος,
1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι
1 ΕΙΣΑΓΩΓΗ Η γλώσσα προγραµµατισµού Java είναι ισχυρά τυποποιηµένη (strongly typed), που σηµαίνει ότι κάθε µεταβλητή και κάθε έκφραση έχει κάποιο τύπο, ο οποίος πρέπει να είναι γνωστός κατά το χρόνο της
Υπολογιστικά Συστήματα
Υπολογιστικά Συστήματα Ενότητα 3: Βασικά στοιχεία της γλώσσας προγραμματισμού Visual Basic for Applications (VBA) Σαπρίκης Ευάγγελος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά) Άδειες Χρήσης Το παρόν εκπαιδευτικό
Στοιχεία Προγραμματισμού Σε Γραφικό Περιβάλλον Φύλλο εργασίας 1 ο
Τετάρτη, 30 Οκτωβρίου 2013 Στοιχεία Προγραμματισμού Σε Γραφικό Περιβάλλον Φύλλο εργασίας 1 ο Λύστε στο Visual Basic Express 2010 τις παρακάτω ασκήσεις: 1. Να δημιουργήσετε ένα νέο Project του είδους Console
2 Visual Basic. Χαριτούδη Γεωργία
A VISUAL BASIC 2 Visual Basic Το όνομα Basic είναι τα αρχικά γράμματα της φράσης Beginner s All-purpose Symbolic Instruction Code. Η Microsoft βάσισε την Visual Basic σε μια γλώσσα προγραμματισμού γραμμένη
GobiExport: Millennium Orders Γ Ρ Α Φ Ε Ι Ο Δ Ι Α Χ Ε Ι Ρ Ι Σ Η Σ Υ Λ Ι Κ Ο Υ - Τ Μ Η Μ Α Π Α Ρ Α Γ Γ Ε Λ Ι Ω Ν Ε Ν Τ Υ Π Ο Υ Υ Λ Ι Κ Ο Υ
GobiExport: Millennium Orders 1 Τι είναι το GOBI3; Το GOBI3 (Global Online Bibliographic Information) είναι ένα διαδικτυακό εργαλείο του YBP (Baker & Taylor) που χρησιμοποιείται από ακαδημαϊκούς, ερευνητές
Βάσεις Δεδομένων Ι 6. Ιδιότητες πεδίων. Τμήμα Διοίκησης Επιχειρήσεων (Μεσολόγγι) ΤΕΙ Δυτικής Ελλάδας
Βάσεις Δεδομένων Ι 6 Ιδιότητες πεδίων Τμήμα Διοίκησης Επιχειρήσεων (Μεσολόγγι) ΤΕΙ Δυτικής Ελλάδας ΝΙΚΟΣ ΚΑΡΟΥΣΟΣ - ΔΙΟΝΥΣΗΣ ΚΑΡΟΥΣΟΣ XE 2015-2016 Εισαγωγή Οι ιδιότητες των πεδίων διαφέρουν ανάλογα με
Υπολογιστικά Συστήματα
Υπολογιστικά Συστήματα Ενότητα 6: Ασκήσεις στη Visual Basic for Applications (VBA) Σαπρίκης Ευάγγελος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά) Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες
Εισαγωγή στην Πληροφορική & τον Προγραμματισμό
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Εισαγωγή στην Πληροφορική & τον Προγραμματισμό Ενότητα 11 η : Αντικείμενα Γραφικής Διασύνδεσης (Μέρος 1 ο ) Ι. Ψαρομήλιγκος Χ.
Καταχώρηση Αποδείξεων
Καταχώρηση Αποδείξεων Το συγκεκριμένο εγχειρίδιο δημιουργήθηκε για να βοηθήσει την κατανόηση της διαδικασίας Καταχώρησης Αποδείξεων. Παρακάτω προτείνεται μια αλληλουχία ενεργειών την οποία ο χρήστης πρέπει
Προγραμματισμός ΙΙ Εισαγωγή Τμήμα Ηλεκτρονικών Μηχανικών Εργαστήριο στην C# ΤΕΙ ΣΤΕΡΕΑΣ ΕΛΛΑΔΑΣ
Βασική Δομή Προγράμματος Τερματικού (Console Application) Module Module1 Console.WriteLine("TEI Lamias") Console.ReadLine() End Module using System; using System.Collections.Generic; using System.Linq;
Microsoft PowerPoint 2007
Information Technology Services and Solutions Σύμβουλοι Μηχανογράφησης και Εκπαίδευσης Στεφ. Σκουλούδη 27, Καλλίπολη, Πειραιάς 210 45 38 177 http://www.itss.gr/ Microsoft PowerPoint 2007 Κωνσταντίνος Κωβαίος
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java III Το if-else statement Το if-else statement δουλεύει καλά όταν στο condition θέλουμε να περιγράψουμε μια επιλογή με δύο πιθανά ενδεχόμενα.
TEC410 Ανάπτυξη Δικτυακών Τόπων (Δ εξάμηνο)
TEC410 Ανάπτυξη Δικτυακών Τόπων (Δ εξάμηνο) Διδάσκων: Ανδρέας Γιαννακουλόπουλος Επιστημονικός συνεργάτης Εργαστηρίου: Στέλλα Λάμπουρα Εαρινό εξάμηνο Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί
Εργαστήριο 9. Styling with Javascript
Εργαστήριο 9 Styling with Javascript Pimp my Text with Javascript Today you'll write a page where the user can type text into a box, and by clicking on UI controls, the user can "pimp out" the text by
Εργαλεία Ανάπτυξης Εφαρμογών Internet. Δ.Ι.Ε.Κ. Γλυφάδας Τεχνικός Εφαρμογών Πληροφορικής
Εργαλεία Ανάπτυξης Εφαρμογών Internet Δ.Ι.Ε.Κ. Γλυφάδας Τεχνικός Εφαρμογών Πληροφορικής Το πρότυπο CSS Α Μέρος 2 CSS (Cascading Style Sheets)(1) Ορίζουν την εμφάνιση των στοιχείων σε ένα έγγραφο HTML.
Στοιχειώδης προγραμματισμός σε C++
Στοιχειώδης προγραμματισμός σε C++ Σύντομο Ιστορικό. Το πρόγραμμα Hello World. Ο τελεστής εξόδου. Μεταβλητές και δηλώσεις τους. Αντικείμενα, μεταβλητές, σταθερές. Ο τελεστής εισόδου. Θεμελιώδεις τύποι.
Τεχνικές Προγραμματισμού και Χρήση Λογισμικού Η/Υ στις Κατασκευές
ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Τεχνικές Προγραμματισμού και Χρήση Λογισμικού Η/Υ στις Κατασκευές Ενότητα 4: Διαχείριση μητρώων Αναστάσιος Σέξτος Αναπληρωτής Καθηγητής
> μεγαλύτερο <= μικρότερο ή ίσο < μικρότερο == ισότητα >= μεγαλύτερο ή ίσο!= διαφορετικό
5 ο Εργαστήριο Λογικοί Τελεστές, Δομές Ελέγχου Λογικοί Τελεστές > μεγαλύτερο = μεγαλύτερο ή ίσο!= διαφορετικό Οι λογικοί τελεστές χρησιμοποιούνται για να ελέγξουμε
Δημιουργώντας μια εφαρμογή ζωγραφικής. 2 η Εργασία
Δημιουργώντας μια εφαρμογή ζωγραφικής 2 η Εργασία Απαιτήσεις 1. Σύνδεση στο Διαδίκτυο (διότι οι εφαρμογές δημιουργούνται online) 2. Εγκατεστημένος ο Browser Google Chrome 3. Υπαρκτός λογαριασμός Gmail
Λογισμικά για Στατιστική Ανάλυση. Minitab, R (ελεύθερο λογισμικό), Sas, S-Plus, Stata, StatGraphics, Mathematica (εξειδικευμένο λογισμικό για
ΒΙΟΣΤΑΤΙΣΤΙΚΗ Εργαστήριο 1ο Τι είναι το SPSS; Statistical Package for the Social Sciences Λογισμικό για διαχείριση και στατιστική ανάλυση δεδομένων σε γραφικό περιβάλλον http://en.wikipedia.org/wiki/spss
Object-Oriented. and Objects
Object-Oriented Programming: Classes and Objects Software 12/5/2014 Development 2 Introduction Η βασική ορολογία και οι έννοιες του αντικειµενοστραφούς προγραµµατισµού έχουν εισαχθεί στην ενότητα 1.14.
CTEC-153: ΥΤΛΛΑ ΕΡΓΑΙΑ
ΜΑΘΗΜΑ 6 ΣΟΦΟΙ: 1. Δημιουργία Διαφορετικών Σύπων Γραφημάτων Από Σα Δεδομένα Ενός Τπολογιστικού Υύλλου: Γράφημα τήλης, Γραμμής, Πίτας, Ράβδων 2. Βασικά Μέρη Ενός Γραφήματος 3. Αλλαγή Μεγέθους Ενός Γραφήματος
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Δημιουργία Κλάσεων και Αντικειμένων Κλάση Μια κλάση είναι μία αφηρημένη περιγραφή αντικειμένων με κοινά χαρακτηριστικά και κοινή συμπεριφορά. Ένα καλούπι/πρότυπο
Εισαγωγή στην HTML. Κεφ. HTML + CSS
Εισαγωγή στην HTML Κεφ. HTML + CSS Συστατικά καλής Ιστοσελίδας α) HTML για το Περιεχόμενο β) CSS για τη μορφοποίηση γ) Javascript για διαδραστικότητα Παράδειγμα Ολυμπιακός Πανιώνιος ΠΑΟΚ Παναθηναϊκός Ξάνθη
Οδηγίες Στο σημερινό εργαστήριο θα αρχίσετε να χρησιμοποιείτε βασικές οδηγίες μορφοποίησης της ιστοσελίδας σας (κάτι που έχουμε αποφύγει έως τώρα!).
Εργαστήριο #8 Τι πρέπει να έχετε ολοκληρώσει από το προηγούμενο εργαστήριο. Το σημερινό εργαστήριο είναι ανεξάρτητο από τα προηγούμενα, επειδή όμως θα ζητηθεί να ανακυκλώσετε υλικό από εκείνα, βεβαιωθείτε
Συναρτήσεις στη Visual Basic 6.0
Προγραμματισμός & Εφαρμογές Υπολογιστών Μάθημα 4ο Συναρτήσεις στη Visual Basic 6.0 Κ. Κωστοπούλου Σειρά εκτέλεσης των πράξεων Όταν ορίζετε μια ακολουθία αριθμητικών πράξεων είναι δυνατόν να προκύψει αμφισημία.
1 ο Εργαστήριο Συντεταγμένες, Χρώματα, Σχήματα
1 ο Εργαστήριο Συντεταγμένες, Χρώματα, Σχήματα 1. Σύστημα Συντεταγμένων Το σύστημα συντεταγμένων που έχουμε συνηθίσει από το σχολείο τοποθετούσε το σημείο (0,0) στο σημείο τομής των δυο αξόνων Χ και Υ.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές Μαθήματα από το lab Υπενθύμιση: Η άσκηση ζητούσε να υλοποιήσετε μία κλάση vector που να διαχειρίζεται διανύσματα οποιουδήποτε
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να αναπτύξουν ένα πρόγραμμα όπου θα επαναλάβουν τα βήματα ανάπτυξης μιας παραθυρικής εφαρμογής.
Για να δείτε όλες τις εγγραφές της εκτύπωσης μπορείτε να χρησιμοποιήσετε τα βελάκια.
Published on PRISMA Win Help - Megasoft (http://docs.megasoft.gr) Home > PRISMA Win Εμπορικό > Πελάτες > Εκτυπώσεις Εκτυπώσεις Λογιστικές Καρτέλα Πελάτη Στην Καρτέλα του Πελάτη εμφανίζονται αναλυτικά,
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα 1 Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται και τυπώνει τη θέση του.
ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ V ΕΚΠΑΙΔΕΥΤΗΣ ΓΑΛΑΝΟΣ ΓΕΩΡΓΙΟΣ
1 Ο Ι.Ε.Κ ΠΕΙΡΑΙΑ ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ V ΕΚΠΑΙΔΕΥΤΗΣ ΓΑΛΑΝΟΣ ΓΕΩΡΓΙΟΣ Δημιουργία Βάσης Δεδομένων σε Περιβάλλον VISUAL BASIC: 1. Κλικ στο Add-Ins 2. Επιλέγω Visual Data
ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών
ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών Διδάσκων: Δρ. Γιώργος Ζάγγουλος Email: zaggoulos.george@ucy.ac.cy www.ece.ucy.ac.cy/courses/ece213 Μετατροπή ASCII σε Δεκαδικό
Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή
Στόχοι και αντικείμενο ενότητας Η έννοια του Τελεστή #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Εκφράσεις Προτεραιότητα Προσεταιριστικότητα Χρήση παρενθέσεων Μετατροπές Τύπων Υπονοούμενες και ρητές μετατροπές
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών
Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Nα κατασκευάσουν πίνακες από δεδομένα. Να κατασκευάσουν συναρτήσεις με πίνακες. Να κάνουν χρήση
Εισαγωγή στην Πληροφορική & τον Προγραμματισμό
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Εισαγωγή στην Πληροφορική & τον Προγραμματισμό Ενότητα 9 η : Πίνακες & Εφαρμογές Ι. Ψαρομήλιγκος Χ. Κυτάγιας Τμήμα Διοίκησης Επιχειρήσεων
(3) Από την εργαλειοθήκη επιλέξτε το εργαλείο «ετικέτας (Label)». Δημιουργήστε μια ετικέτα στην φόρμα σας.
Σαχπατζίδης Αβραάμ Καθηγητής Πληροφορικής Π.Ε 20 Master of Arts (M.A) in "Gender, New Forms of Education, New Forms of Employment and New Technologies in the Information Age". ΚΕΦΑΛΑΙΟ 2 Χρήση εργαλείων
Το απεικονιστικό μοντέλο μορφοποίησης των CSS
Δικτυακά Πολυμέσα ΙΙ Εργαστήριο #6 0 : CSS: Χρήση των ιδιοτήτων του κουτιού (box properties). Διάταξη σελίδων Γαβαλάς Δαμιανός dgavalas@aegean.gr Το απεικονιστικό μοντέλο μορφοποίησης των CSS Περιγράφει
Η ιευρυµένη Επιχείρηση Ενότητα Ηλεκτρονικής Μάθησης. «CourseLab» 3ο Φροντιστήριο. Ιωάννα Ταλάντη Υπ. ιδάκτωρ, Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας
Η ιευρυµένη Επιχείρηση Ενότητα Ηλεκτρονικής Μάθησης «CourseLab» 3ο Φροντιστήριο Ιωάννα Ταλάντη Υπ. ιδάκτωρ, Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας italanti@aueb.gr Actions and Events 1 Events common
ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών
ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών Διδάσκων: Δρ. Γιώργος Ζάγγουλος Email: zaggoulos.george@ucy.ac.cy www.ece.ucy.ac.cy/courses/ece213 Ορίσματα στο QtSpim (set parameters
Βυζαντινός Ρεπαντής Κολλέγιο Αθηνών 2010
Βυζαντινός Ρεπαντής Κολλέγιο Αθηνών 2010 Δημιουργία ενός απλού παιχνιδιού με το Gamemaker (μετάφραση από το http://www.stuffucanuse.com/downloads/gamemaker-introductionlessons/free_game_downloads_gamemaker.htm)
ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών
ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών Διδάσκων: Δρ. Γιώργος Ζάγγουλος Email: zaggoulos.george@ucy.ac.cy www.ece.ucy.ac.cy/courses/ece213 Μετατροπή ASCII σε Δεκαδικό
ΠΡΟΓΡΑΜΜΑ ΑΠΟΜΑΚΡΥΣΜΕΝΗΣ ΕΙΣΑΓΩΓΗΣ ΒΑΘΜΟΛΟΓΙΩΝ ΑΠΟ ΔΙΔΑΣΚΟΝΤΕΣ
ΠΡΟΓΡΑΜΜΑ ΑΠΟΜΑΚΡΥΣΜΕΝΗΣ ΕΙΣΑΓΩΓΗΣ ΒΑΘΜΟΛΟΓΙΩΝ ΑΠΟ ΔΙΔΑΣΚΟΝΤΕΣ 1. ΓΕΝΙΚΑ Εκδοση 1.0, 26/08/2009 Η εγκατάσταση του προγράμματος απομακρυσμένης εισαγωγής βαθμολογιών απαιτεί περιβάλλον windows (Windows 2000,
1. ΕΛΕΓΧΟΙ ΕΓΚΥΡΟΤΗΤΑΣ ΣΕ ΜΙΑ ΦΟΡΜΑ
Αναλυτικά Data Validation FORM LEVEL VALIDATION - DATA LEVEL VALIDATION - επίπεδο φόρμας επίπεδο dataset 1. ΕΛΕΓΧΟΙ ΕΓΚΥΡΟΤΗΤΑΣ ΣΕ ΜΙΑ ΦΟΡΜΑ Έλεγχος εγκυρότητας δεδοµένων σε ένα Control της φόρµας event
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Προγραμματισμός Η/Υ Ενότητα 10 η : Το αντικείμενο Συλλογή (Collection) & τα αντικείμενα ListBox, CheckedListBox & ComboBox Ι.
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Εργαστήριο 1
ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Εργαστήριο 1 Τι είναι Βάση Δεδομένων Σύστημα διαχείρισης βάσεων δεδομένων Α σύστημα διαχείρισης βάσεων δεδομένων (ΠΔΒΔ (πρόγραμμα διαχείρισης βάσεων δεδομένων)) είναι λογισμικό υπολογιστών
ΛΥΚΕΙΟ ΣΟΛΕΑΣ Σχολική χρονιά 2008-2009
ΛΥΚΕΙΟ ΣΟΛΕΑΣ Σχολική χρονιά 2008-2009 ΓΡΑΠΤΕΣ ΠΡΟΑΓΩΓΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΙΟΥΝΙΟΥ 2009 ΜΑΘΗΜΑ: ΠΛΗΡΟΦΟΡΙΚΗ ΤΑΞΗ : Β ΗΜΕΡΟΜΗΝΙΑ: Τετάρτη, 3 Ιουνίου 2009 ΩΡΑ: 07:45 10:15 ΟΔΗΓΙΕΣ: Το εξεταστικό δοκίμιο αυτό αποτελείται
Εισαγωγή στο πρόγραμμα Microsoft word 2003
Εισαγωγή στο πρόγραμμα Microsoft word 2003 Έναρξη 1. Εκκίνηση του προγράμματος Για να ξεκινήσουμε το Word, πατάμε στο κουμπί Εναρξη και από το μενού που εμφανίζεται επιλέγουμε Προγράμματα και Microsoft