Zeus UpDownControls Ver. 1.0

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Zeus UpDownControls Ver. 1.0"

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 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 Zeus RelayCommand Ver. 1.0 Manual Copyright 2018 Χρήστος Μουρατίδης Zeus RelayCommand ZEUS RELAYCOMMAND VERSION 1.0... 2 Ο ΟΡΙΣΜΟΣ ΤΗΣ ΚΛΑΣΗΣ... 3 ΔΙΑΝΟΜΗ... 4 ΕΠΙΚΟΙΝΩΝΙΑ... 5 ΠΑΡΑΔΕΙΓΜΑ ΧΡΗΣΗΣ... 6 Η

Διαβάστε περισσότερα

Σχεδόν όλες οι ιστοσελίδες βασίζονται σε μεγάλο βαθμό σε πίνακες. Για να εισάγουμε έναν πίνακα επιλέγουμε από το μενού Insert->Table.

Σχεδόν όλες οι ιστοσελίδες βασίζονται σε μεγάλο βαθμό σε πίνακες. Για να εισάγουμε έναν πίνακα επιλέγουμε από το μενού Insert->Table. DreamWeaver - Άσκηση 4η Πίνακες Παρακάτω θα δούμε πως μπορούμε να δημιουργούμε και να επεξεργαζόμαστε πίνακες, μια πολύ βασική δομή. Θα δούμε πως γίνεται εισαγωγή πίνακα, ένωση κελιών του πίνακα, προσθήκη

Διαβάστε περισσότερα

ΤΕΙ ΗΠΕΙΡΟΥ ΣΧΟΛΗ: Τεχνολογικών Εφαρμογών ΤΜΗΜΑ: Μηχανικών Πληροφορικής Τ.Ε.

ΤΕΙ ΗΠΕΙΡΟΥ ΣΧΟΛΗ: Τεχνολογικών Εφαρμογών ΤΜΗΜΑ: Μηχανικών Πληροφορικής Τ.Ε. ΤΕΙ ΗΠΕΙΡΟΥ ΣΧΟΛΗ: Τεχνολογικών Εφαρμογών ΤΜΗΜΑ: Μηχανικών Πληροφορικής Τ.Ε. ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΘΕΜΑ: «ΑΝΑΠΤΥΞΗ ΠΡΟΓΡΑΜΜΑΤΟΣ ΓΡΑΜΜΑΤΕΙΑΚΗΣ ΥΠΟΣΤΗΡΙΞΗΣ ΓΙΑ ΣΧΟΛΗ ΟΔΗΓΩΝ ΣΕ C#» ΟΝΟΜΑΤΕΠΩΝΥΜΟ: Βασιλάκης Σταύρος

Διαβάστε περισσότερα

Γ3.3.Μ7 ΕΠΑΝΆΛΗΨΗ ΜΈΡΟΣ Α: ΈΝΝΟΙΕΣ ΤΙ ΕΊΝΑΙ Η VISUAL BASIC ΤΙ ΜΠΟΡΟΎΜΕ ΝΑ ΚΆΝΟΥΜΕ ΜΕ ΤΗ VISUAL BASIC ΑΝΤΙΚΕΊΜΕΝΑ: ΦΌΡΜΑ ΚΑΙ ΧΕΙΡΙΣΤΉΡΙΑ ΕΤΙΚΈΤΑ LABEL

Γ3.3.Μ7 ΕΠΑΝΆΛΗΨΗ ΜΈΡΟΣ Α: ΈΝΝΟΙΕΣ ΤΙ ΕΊΝΑΙ Η VISUAL BASIC ΤΙ ΜΠΟΡΟΎΜΕ ΝΑ ΚΆΝΟΥΜΕ ΜΕ ΤΗ VISUAL BASIC ΑΝΤΙΚΕΊΜΕΝΑ: ΦΌΡΜΑ ΚΑΙ ΧΕΙΡΙΣΤΉΡΙΑ ΕΤΙΚΈΤΑ LABEL Γ3.3.Μ7 ΕΠΑΝΆΛΗΨΗ ΜΈΡΟΣ Α: ΈΝΝΟΙΕΣ ΤΙ ΕΊΝΑΙ Η VISUAL BASIC Η Visual Basic είναι μια γλώσσα προγραμματισμού οδηγούμενη από συμβάντα που έχει ένα ολοκληρωμένο περιβάλλον ανάπτυξης Έχει δημιουργηθεί από τη

Διαβάστε περισσότερα

Γράψιμο και Διάβασμα σε φύλλο του Excel

Γράψιμο και Διάβασμα σε φύλλο του Excel Γράψιμο και Διάβασμα σε φύλλο του Excel Το παρακάτω παράδειγμα γράφει και διαβάζει πληροφορίες σε αρχείο του Excel (workbook). Το απλοϊκό παράδειγμά μας αφορά ένα βιβλιοπωλείο που κρατά, για κάθε βιβλίο,

Διαβάστε περισσότερα

Στην τεχνολογία των CSS, οι κανόνες στυλ (style

Στην τεχνολογία των CSS, οι κανόνες στυλ (style Δικτυακά Πολυμέσα ΙΙ Εργαστήριο #4 0 : CSS: Βασικές και προχωρημένες τεχνικές επιλογής, τα στοιχεία και , ψευδο κλάσεις και ψευδο επιλογείς Γαβαλάς Δαμιανός dgavalas@aegean.gr CSS κανόνες στυλ

Διαβάστε περισσότερα

3D FLASH ANIMATOR (3DFA)

3D FLASH ANIMATOR (3DFA) 3D FLASH ANIMATOR (3DFA) Εισαγωγή Τα βασικά στοιχεία του προγράµµατος 3DFA είναι οι ταινίες (movies), τα στοιχεία (elements), τα keyframes, τα γεγονότα (events) και οι ενέργειες (actions). Ταινίες (movies)

Διαβάστε περισσότερα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Προγραμματισμός Η/Υ Ενότητα 2 η : Η Γλώσσα Προγραμματισμού VB.NET (1 ο Μέρος) Ι. Ψαρομήλιγκος Χ. Κυτάγιας Τμήμα Λογιστικής & Χρηματοοικονομικής

Διαβάστε περισσότερα

ΓΡΑΦΙΚΕΣ ΠΑΡΑΣΤΑΣΕΙΣ ΜΕ ΕXCEL

ΓΡΑΦΙΚΕΣ ΠΑΡΑΣΤΑΣΕΙΣ ΜΕ ΕXCEL ΓΡΑΦΙΚΕΣ ΠΑΡΑΣΤΑΣΕΙΣ ΜΕ ΕXCEL 1. Εισαγωγή δεδομένων σε φύλλο εργασίας του Microsoft Excel Για να τοποθετήσουμε τις μετρήσεις μας σε ένα φύλλο Excel, κάνουμε κλικ στο κελί στο οποίο θέλουμε να τοποθετήσουμε

Διαβάστε περισσότερα

Αναμόρφωση της σχεδίασης γραφικών εξομοίωσης του προγράμματος NEAPOLIS με βάση τις. αναμενόμενες μεσες τιμ ες από τα μοντέλα μόνιμης κατάστασης

Αναμόρφωση της σχεδίασης γραφικών εξομοίωσης του προγράμματος NEAPOLIS με βάση τις. αναμενόμενες μεσες τιμ ες από τα μοντέλα μόνιμης κατάστασης ι 3 ϋ f g ^ΞΞΞΞ 'J3 J ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΑΒΑΛΑΣ ΤΜΗΜΑ ΒΙΟ ΜΗΧΑΝΙΚΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Αναμόρφωση της σχεδίασης γραφικών εξομοίωσης του προγράμματος NEAPOLIS με βάση τις r r r r r a r αναμενόμενες

Διαβάστε περισσότερα

ΟΔΗΓΙΕΣ ΔΗΜΙΟΥΡΓΙΑΣ ΕΦΑΡΜΟΓΗΣ ΔΙΑΧΕΙΡΙΣΗΣ ΑΜΕΣΟΥ ΑΡΧΕΙΟΥ ΣΕ ΠΕΡΙΒΑΛΛΟΝ VISUAL STUDIO NET

ΟΔΗΓΙΕΣ ΔΗΜΙΟΥΡΓΙΑΣ ΕΦΑΡΜΟΓΗΣ ΔΙΑΧΕΙΡΙΣΗΣ ΑΜΕΣΟΥ ΑΡΧΕΙΟΥ ΣΕ ΠΕΡΙΒΑΛΛΟΝ 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. Εσοχές Παραγράφων ΣΤΟΧΟΙ:

ΜΑΘΗΜΑ Στοίχιση Παραγράφων. 2. Εσοχές Παραγράφων ΣΤΟΧΟΙ: ΜΑΘΗΜΑ 4 ΣΤΟΧΟΙ: 1. Στοίχιση Παραγράφων 2. Εσοχές Παραγράφων 3. Διάστημα Μεταξύ Γραμμών (Διάστιχο) 4. Απόσταση Μεταξύ Παραγράφων 5. Καθορισμός Στηλοθετών (Tabs) 6. Μετακίνηση Στηλοθετών 7. Διαγραφή Στηλοθετών

Διαβάστε περισσότερα

Access 2. Φτιάχνοντας μια DB, πίνακες και εισαγωγή εξωτερικών δεδομένων

Access 2. Φτιάχνοντας μια DB, πίνακες και εισαγωγή εξωτερικών δεδομένων Access 2 Φτιάχνοντας μια DB, πίνακες και εισαγωγή εξωτερικών δεδομένων Στόχοι Σχεδιασμός βάσεων δεδομένων και τη ρύθμιση ιδιοτήτων πεδίων Προβάλετε και τροποποιήστε τους τύπους δεδομένων πεδίων και τη

Διαβάστε περισσότερα

Η Βίβλος των CSS - Μέρος 3 Το Box Model, τα Περιθώρια και τα Περιγράμματα

Η Βίβλος των 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 Τμήμα Πληροφορικής & Επικοινωνιών Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010 Ιωάννης Γεωργουδάκης - Πάρις Μαστοροκώστας Σεπτέμβριος 2011 ΠΕΡΙΕΧΟΜΕΝΑ

Διαβάστε περισσότερα

Οδηγίες για εισαγωγή Photo Gallery σε Ιστοσελίδα με το SharePoint Designer 2007

Οδηγίες για εισαγωγή 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 (CSS) Τα Cascading Style Sheets προσφέρουν έναν εύκολο τρόπο για να ορίσουμε τη μορφοποίηση που επιθυμούμε να έχουν οι σελίδες μία τοποθεσίας του Παγκόσμιου Ιστού που δημιουργούμε.

Διαβάστε περισσότερα

Επεξεργασία πολλαπλών φύλλων εργασίας - Γραφημάτων Excel

Επεξεργασία πολλαπλών φύλλων εργασίας - Γραφημάτων Excel Επεξεργασία πολλαπλών φύλλων εργασίας - Γραφημάτων Excel 11.1. Πολλαπλά φύλλα εργασίας Στο προηγούμενο κεφάλαιο δημιουργήσαμε ένα φύλλο εργασίας με τον προϋπολογισμό δαπανών του προσωπικού που θα συμμετάσχει

Διαβάστε περισσότερα

Σύστημα για την παρακολούθηση και διαχείριση έργων

Σύστημα για την παρακολούθηση και διαχείριση έργων ΕΘΝΙΚΌ ΜΕΤΣΌΒΙΟ ΠΟΛΥΤΕΧΝΕΊΟ ΣΧΟΛΉ ΗΛΕΚΤΡΟΛΌΓΩΝ ΜΗΧΑΝΙΚΏΝ ΚΑΙ ΜΗΧΑΝΙΚΏΝ ΥΠΟΛΟΓΙΣΤΏΝ ΤΟΜΈΑΣ ΗΛΕΚΤΡΙΚΏΝ ΒΙΟΜΗΧΑΝΙΚΏΝ ΔΙΑΤΆΞΕΩΝ ΚΑΙ ΣΥΣΤΗΜΆΤΩΝ ΑΠΟΦΆΣΕΩΝ Σύστημα για την παρακολούθηση και διαχείριση έργων ΔΙΠΛΩΜΑΤΙΚΗ

Διαβάστε περισσότερα

Διάλεξη 2η Εισαγωγή στο CSS

Διάλεξη 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. Εισαγωγή ΜICROSOFT VISUAL STUDIO 2008 Eργ 1: Ανάπτυξη απλής εφαρµογής: Solutions, Projects, GUI, Events, Debugging Εισαγωγή Visual Basic 2008 Eργαλείο ανάπτυξης εντυπωσιακών εφαρµογών στα Windows, στο Web, φορητά

Διαβάστε περισσότερα

Τα αντικείμενα ή Χειριστήρια και οι βασικές ιδιότητες τους (properties)

Τα αντικείμενα ή Χειριστήρια και οι βασικές ιδιότητες τους (properties) Καθηγητής : Κώστας Αχιλλέως ΒΑΣΙΚΕΣ ΣΗΜΕΙΩΣΕΙΣ ΓΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΣΤΗ VISUAL BASIC A ΛΥΚΕΙΟΥ ΚΑΤΕΥΘΥΝΣΗΣ Α) Τι είναι η Visual Basic Είναι μια γλώσσα οπτικού προγραμματισμού υψηλού επιπέδου. Β) Οπτικός

Διαβάστε περισσότερα

Πώς εκτυπώνουμε μία λίστα εγγραφών από μία Access database (γενικός τρόπος)

Πώς εκτυπώνουμε μία λίστα εγγραφών από μία Access database (γενικός τρόπος) Πώς εκτυπώνουμε μία λίστα εγγραφών από μία Access database (γενικός τρόπος) Το προηγούμενο tip αναφέρεται στην εκτύπωση με γραμματοσειρά σταθερού πλάτους. Στο παρόν, θα δούμε έναν γενικό τρόπο εκτύπωσης

Διαβάστε περισσότερα

Visual Basic Βασικές Έννοιες

Visual Basic Βασικές Έννοιες Visual Basi Βασικές Έννοιες «Είδα στον ύπνο µου ότι η ζωή είναι χαρά. Ξύπνησα και είδα ότι είναι χρέος. Αγωνίστηκα και είδα ότι τo χρέος είναι χαρά.» Ραµπριτανάθ Ταγκόρ Κουλλάς Χρίστος www.oullas.om oullas

Διαβάστε περισσότερα

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να καταλάβουν την διαφορά ανάμεσα σε τοπικές και καθολικές μεταβλητές. Nα κάνουν αποσφαλμάτωση

Διαβάστε περισσότερα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Προγραμματισμός Η/Υ Ενότητα 8 η : Αντικείμενα για εισαγωγή & επεξεργασία κειμένου (TextBox, RichTextBox, MaskedTextBox) Ι. Ψαρομήλιγκος

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός Αντικειμενοστρεφής Προγραμματισμός Διδάσκουσα: Αναπλ. Καθηγήτρια Ανδριάνα Πρέντζα aprentza@unipi.gr Εργαστηριακός Συνεργάτης: Δρ. Βασιλική Κούφη vassok@unipi.gr Περιεχόμενα Java Classes Java Objects Java

Διαβάστε περισσότερα

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να αναπτύξουν ένα πρόγραμμα όπου θα επαναλάβουν τα βήματα ανάπτυξης μιας παραθυρικής εφαρμογής.

Διαβάστε περισσότερα

Άσκηση 1 (α) Να διατυπώσετε την πιο κάτω λογική έκφραση στη Visual Basic κάνοντας χρήση μεταβλητών:

Άσκηση 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 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07 Αριθμητική στο δυαδικό σύστημα (γενικά) Συμπληρωματικά για δυαδικό σύστημα Η πρόσθεση στηρίζεται στους κανόνες: 0 + 0 = 0, 0 + 1 = 1, 1

Διαβάστε περισσότερα

Σημασιολογικός Ιστός (Semantic Web) - XML

Σημασιολογικός Ιστός (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. 1. Συχνά, όταν ήθελα να δώσω ένα φυλλάδιο εργασίας με ασκήσεις στους μαθητές έκανα το εξής: Version 25-7-2015 ΗΜΙΤΕΛΗΣ!!!! VBA ΣΤΟ WORD Version 25-7-2015 ΗΜΙΤΕΛΗΣ!!!! Μου παρουσιάστηκαν δύο θέματα. 1. Συχνά, όταν ήθελα να δώσω ένα φυλλάδιο εργασίας με ασκήσεις στους μαθητές έκανα το εξής: Εγραφα σε ένα αρχείο του Word τις

Διαβάστε περισσότερα

Εργαστήριο 2 - Άσκηση - Ανάλυση

Εργαστήριο 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 ΛΑΒΕΣ 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. <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 ~ Θέματα Προγραμματισμού Διαδικτύου ~ CSS ~ Στελιος Σφακιανάκης Εαρινό 2019 Αυτή η εργασία χορηγείται με άδεια Creative Commons Αναφορά Δημιουργού - Μη Εμπορική Χρήση - Παρόμοια Διανομή 1 Εισαγωγή στο CSS

Διαβάστε περισσότερα

Πώς εκτυπώνουμε μία λίστα από εγγραφές μίας Access database

Πώς εκτυπώνουμε μία λίστα από εγγραφές μίας Access database Πώς εκτυπώνουμε μία λίστα από εγγραφές μίας Access database Στο παρόν παράδειγμα, θα δούμε πώς εκτυπώνουμε έναν κατάλογο με συγκεκριμένα στοιχεία μαθητών, με γραμματοσειρά σταθερού πλάτους. Δηλαδή, θα

Διαβάστε περισσότερα

Εισαγωγή στο MATLAB. Κολοβού Αθανασία, ΕΔΙΠ,

Εισαγωγή στο MATLAB. Κολοβού Αθανασία, ΕΔΙΠ, Εισαγωγή στο MATLAB Κολοβού Αθανασία, ΕΔΙΠ, akolovou@di.uoa.gr Εγκατάσταση του Matlab Διανέμεται ελεύθερα στα μέλη του ΕΚΠΑ το λογισμικό MATLAB με 75 ταυτόχρονες (concurrent) άδειες χρήσης. Μπορείτε να

Διαβάστε περισσότερα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται και τυπώνει τη θέση του.

Διαβάστε περισσότερα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Προγραμματισμός Η/Υ Ενότητα 9 η : Αντικείμενα για επιλογή τιμής (CheckBox, RadioButton) & το αντικείμενο ομαδοποίησης GroupBox

Διαβάστε περισσότερα

Αρχιτεκτονική υπολογιστών

Αρχιτεκτονική υπολογιστών 1 Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου Αρχιτεκτονική υπολογιστών Ενότητα 9 : Ομάδες Εντολών: Ιδιότητες και Λειτουργίες Ευάγγελος Καρβούνης Παρασκευή, 15/01/2016 Τι είναι ομάδα εντολών;

Διαβάστε περισσότερα

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να αναπτύξουν ένα πρόγραμμα όπου θα επαναλάβουν τα βήματα ανάπτυξης μιας παραθυρικής εφαρμογής.

Διαβάστε περισσότερα

ΟΔΗΓΙΕΣ ΕΓΚΑΤΑΣΤΑΣΗΣ ΚΑΙ ΧΕΙΡΙΣΜΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ WINLABEL

ΟΔΗΓΙΕΣ ΕΓΚΑΤΑΣΤΑΣΗΣ ΚΑΙ ΧΕΙΡΙΣΜΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ 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) Προγραμματιστικό Εργαλείο: GAME MAKER Ονοματεπώνυμο: Τμήμα: Σκοπός σας είναι να φτιάξετε ένα ηλεκτρονικό παιχνίδι για περιπλάνηση σε Λαβύρινθο (MAZE) χρησιμοποιώντας

Διαβάστε περισσότερα

Σχήµα 4.1: Εισαγωγή βρόγχου while-loop.

Σχήµα 4.1: Εισαγωγή βρόγχου while-loop. Ο βρόγχος While-loop 1. Ο βρόγχος while-loop εκτελείται έως ότου ικανοποιηθεί µία προκαθορισµένη συνθήκη. 2. Ο αριθµός των επαναλήψεων ενός βρόγχου while-loop δεν είναι εκ των προτέρων προκαθορισµένος,

Διαβάστε περισσότερα

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι 1 ΕΙΣΑΓΩΓΗ Η γλώσσα προγραµµατισµού Java είναι ισχυρά τυποποιηµένη (strongly typed), που σηµαίνει ότι κάθε µεταβλητή και κάθε έκφραση έχει κάποιο τύπο, ο οποίος πρέπει να είναι γνωστός κατά το χρόνο της

Διαβάστε περισσότερα

Υπολογιστικά Συστήματα

Υπολογιστικά Συστήματα Υπολογιστικά Συστήματα Ενότητα 3: Βασικά στοιχεία της γλώσσας προγραμματισμού Visual Basic for Applications (VBA) Σαπρίκης Ευάγγελος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά) Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Στοιχεία Προγραμματισμού Σε Γραφικό Περιβάλλον Φύλλο εργασίας 1 ο

Στοιχεία Προγραμματισμού Σε Γραφικό Περιβάλλον Φύλλο εργασίας 1 ο Τετάρτη, 30 Οκτωβρίου 2013 Στοιχεία Προγραμματισμού Σε Γραφικό Περιβάλλον Φύλλο εργασίας 1 ο Λύστε στο Visual Basic Express 2010 τις παρακάτω ασκήσεις: 1. Να δημιουργήσετε ένα νέο Project του είδους Console

Διαβάστε περισσότερα

2 Visual Basic. Χαριτούδη Γεωργία

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 Γ Ρ Α Φ Ε Ι Ο Δ Ι Α Χ Ε Ι Ρ Ι Σ Η Σ Υ Λ Ι Κ Ο Υ - Τ Μ Η Μ Α Π Α Ρ Α Γ Γ Ε Λ Ι Ω Ν Ε Ν Τ Υ Π Ο Υ Υ Λ Ι Κ Ο Υ GobiExport: Millennium Orders 1 Τι είναι το GOBI3; Το GOBI3 (Global Online Bibliographic Information) είναι ένα διαδικτυακό εργαλείο του YBP (Baker & Taylor) που χρησιμοποιείται από ακαδημαϊκούς, ερευνητές

Διαβάστε περισσότερα

Βάσεις Δεδομένων Ι 6. Ιδιότητες πεδίων. Τμήμα Διοίκησης Επιχειρήσεων (Μεσολόγγι) ΤΕΙ Δυτικής Ελλάδας

Βάσεις Δεδομένων Ι 6. Ιδιότητες πεδίων. Τμήμα Διοίκησης Επιχειρήσεων (Μεσολόγγι) ΤΕΙ Δυτικής Ελλάδας Βάσεις Δεδομένων Ι 6 Ιδιότητες πεδίων Τμήμα Διοίκησης Επιχειρήσεων (Μεσολόγγι) ΤΕΙ Δυτικής Ελλάδας ΝΙΚΟΣ ΚΑΡΟΥΣΟΣ - ΔΙΟΝΥΣΗΣ ΚΑΡΟΥΣΟΣ XE 2015-2016 Εισαγωγή Οι ιδιότητες των πεδίων διαφέρουν ανάλογα με

Διαβάστε περισσότερα

Υπολογιστικά Συστήματα

Υπολογιστικά Συστήματα Υπολογιστικά Συστήματα Ενότητα 6: Ασκήσεις στη Visual Basic for Applications (VBA) Σαπρίκης Ευάγγελος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά) Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Εισαγωγή στην Πληροφορική & τον Προγραμματισμό Ενότητα 11 η : Αντικείμενα Γραφικής Διασύνδεσης (Μέρος 1 ο ) Ι. Ψαρομήλιγκος Χ.

Διαβάστε περισσότερα

Καταχώρηση Αποδείξεων

Καταχώρηση Αποδείξεων Καταχώρηση Αποδείξεων Το συγκεκριμένο εγχειρίδιο δημιουργήθηκε για να βοηθήσει την κατανόηση της διαδικασίας Καταχώρησης Αποδείξεων. Παρακάτω προτείνεται μια αλληλουχία ενεργειών την οποία ο χρήστης πρέπει

Διαβάστε περισσότερα

Προγραμματισμός ΙΙ Εισαγωγή Τμήμα Ηλεκτρονικών Μηχανικών Εργαστήριο στην C# ΤΕΙ ΣΤΕΡΕΑΣ ΕΛΛΑΔΑΣ

Προγραμματισμός ΙΙ Εισαγωγή Τμήμα Ηλεκτρονικών Μηχανικών Εργαστήριο στην 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

Microsoft PowerPoint 2007 Information Technology Services and Solutions Σύμβουλοι Μηχανογράφησης και Εκπαίδευσης Στεφ. Σκουλούδη 27, Καλλίπολη, Πειραιάς 210 45 38 177 http://www.itss.gr/ Microsoft PowerPoint 2007 Κωνσταντίνος Κωβαίος

Διαβάστε περισσότερα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java III Το if-else statement Το if-else statement δουλεύει καλά όταν στο condition θέλουμε να περιγράψουμε μια επιλογή με δύο πιθανά ενδεχόμενα.

Διαβάστε περισσότερα

TEC410 Ανάπτυξη Δικτυακών Τόπων (Δ εξάμηνο)

TEC410 Ανάπτυξη Δικτυακών Τόπων (Δ εξάμηνο) TEC410 Ανάπτυξη Δικτυακών Τόπων (Δ εξάμηνο) Διδάσκων: Ανδρέας Γιαννακουλόπουλος Επιστημονικός συνεργάτης Εργαστηρίου: Στέλλα Λάμπουρα Εαρινό εξάμηνο Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί

Διαβάστε περισσότερα

Εργαστήριο 9. Styling with Javascript

Εργαστήριο 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. Δ.Ι.Ε.Κ. Γλυφάδας Τεχνικός Εφαρμογών Πληροφορικής Εργαλεία Ανάπτυξης Εφαρμογών Internet Δ.Ι.Ε.Κ. Γλυφάδας Τεχνικός Εφαρμογών Πληροφορικής Το πρότυπο CSS Α Μέρος 2 CSS (Cascading Style Sheets)(1) Ορίζουν την εμφάνιση των στοιχείων σε ένα έγγραφο HTML.

Διαβάστε περισσότερα

Στοιχειώδης προγραμματισμός σε C++

Στοιχειώδης προγραμματισμός σε C++ Στοιχειώδης προγραμματισμός σε C++ Σύντομο Ιστορικό. Το πρόγραμμα Hello World. Ο τελεστής εξόδου. Μεταβλητές και δηλώσεις τους. Αντικείμενα, μεταβλητές, σταθερές. Ο τελεστής εισόδου. Θεμελιώδεις τύποι.

Διαβάστε περισσότερα

Τεχνικές Προγραμματισμού και Χρήση Λογισμικού Η/Υ στις Κατασκευές

Τεχνικές Προγραμματισμού και Χρήση Λογισμικού Η/Υ στις Κατασκευές ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Τεχνικές Προγραμματισμού και Χρήση Λογισμικού Η/Υ στις Κατασκευές Ενότητα 4: Διαχείριση μητρώων Αναστάσιος Σέξτος Αναπληρωτής Καθηγητής

Διαβάστε περισσότερα

> μεγαλύτερο <= μικρότερο ή ίσο < μικρότερο == ισότητα >= μεγαλύτερο ή ίσο!= διαφορετικό

> μεγαλύτερο <= μικρότερο ή ίσο < μικρότερο == ισότητα >= μεγαλύτερο ή ίσο!= διαφορετικό 5 ο Εργαστήριο Λογικοί Τελεστές, Δομές Ελέγχου Λογικοί Τελεστές > μεγαλύτερο = μεγαλύτερο ή ίσο!= διαφορετικό Οι λογικοί τελεστές χρησιμοποιούνται για να ελέγξουμε

Διαβάστε περισσότερα

Δημιουργώντας μια εφαρμογή ζωγραφικής. 2 η Εργασία

Δημιουργώντας μια εφαρμογή ζωγραφικής. 2 η Εργασία Δημιουργώντας μια εφαρμογή ζωγραφικής 2 η Εργασία Απαιτήσεις 1. Σύνδεση στο Διαδίκτυο (διότι οι εφαρμογές δημιουργούνται online) 2. Εγκατεστημένος ο Browser Google Chrome 3. Υπαρκτός λογαριασμός Gmail

Διαβάστε περισσότερα

Λογισμικά για Στατιστική Ανάλυση. Minitab, R (ελεύθερο λογισμικό), Sas, S-Plus, Stata, StatGraphics, Mathematica (εξειδικευμένο λογισμικό για

Λογισμικά για Στατιστική Ανάλυση. 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. and Objects Object-Oriented Programming: Classes and Objects Software 12/5/2014 Development 2 Introduction Η βασική ορολογία και οι έννοιες του αντικειµενοστραφούς προγραµµατισµού έχουν εισαχθεί στην ενότητα 1.14.

Διαβάστε περισσότερα

CTEC-153: ΥΤΛΛΑ ΕΡΓΑΙΑ

CTEC-153: ΥΤΛΛΑ ΕΡΓΑΙΑ ΜΑΘΗΜΑ 6 ΣΟΦΟΙ: 1. Δημιουργία Διαφορετικών Σύπων Γραφημάτων Από Σα Δεδομένα Ενός Τπολογιστικού Υύλλου: Γράφημα τήλης, Γραμμής, Πίτας, Ράβδων 2. Βασικά Μέρη Ενός Γραφήματος 3. Αλλαγή Μεγέθους Ενός Γραφήματος

Διαβάστε περισσότερα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Δημιουργία Κλάσεων και Αντικειμένων Κλάση Μια κλάση είναι μία αφηρημένη περιγραφή αντικειμένων με κοινά χαρακτηριστικά και κοινή συμπεριφορά. Ένα καλούπι/πρότυπο

Διαβάστε περισσότερα

Εισαγωγή στην HTML. Κεφ. HTML + CSS

Εισαγωγή στην HTML. Κεφ. HTML + CSS Εισαγωγή στην HTML Κεφ. HTML + CSS Συστατικά καλής Ιστοσελίδας α) HTML για το Περιεχόμενο β) CSS για τη μορφοποίηση γ) Javascript για διαδραστικότητα Παράδειγμα Ολυμπιακός Πανιώνιος ΠΑΟΚ Παναθηναϊκός Ξάνθη

Διαβάστε περισσότερα

Οδηγίες Στο σημερινό εργαστήριο θα αρχίσετε να χρησιμοποιείτε βασικές οδηγίες μορφοποίησης της ιστοσελίδας σας (κάτι που έχουμε αποφύγει έως τώρα!).

Οδηγίες Στο σημερινό εργαστήριο θα αρχίσετε να χρησιμοποιείτε βασικές οδηγίες μορφοποίησης της ιστοσελίδας σας (κάτι που έχουμε αποφύγει έως τώρα!). Εργαστήριο #8 Τι πρέπει να έχετε ολοκληρώσει από το προηγούμενο εργαστήριο. Το σημερινό εργαστήριο είναι ανεξάρτητο από τα προηγούμενα, επειδή όμως θα ζητηθεί να ανακυκλώσετε υλικό από εκείνα, βεβαιωθείτε

Διαβάστε περισσότερα

Συναρτήσεις στη Visual Basic 6.0

Συναρτήσεις στη Visual Basic 6.0 Προγραμματισμός & Εφαρμογές Υπολογιστών Μάθημα 4ο Συναρτήσεις στη Visual Basic 6.0 Κ. Κωστοπούλου Σειρά εκτέλεσης των πράξεων Όταν ορίζετε μια ακολουθία αριθμητικών πράξεων είναι δυνατόν να προκύψει αμφισημία.

Διαβάστε περισσότερα

1 ο Εργαστήριο Συντεταγμένες, Χρώματα, Σχήματα

1 ο Εργαστήριο Συντεταγμένες, Χρώματα, Σχήματα 1 ο Εργαστήριο Συντεταγμένες, Χρώματα, Σχήματα 1. Σύστημα Συντεταγμένων Το σύστημα συντεταγμένων που έχουμε συνηθίσει από το σχολείο τοποθετούσε το σημείο (0,0) στο σημείο τομής των δυο αξόνων Χ και Υ.

Διαβάστε περισσότερα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές Μαθήματα από το lab Υπενθύμιση: Η άσκηση ζητούσε να υλοποιήσετε μία κλάση vector που να διαχειρίζεται διανύσματα οποιουδήποτε

Διαβάστε περισσότερα

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Να αναπτύξουν ένα πρόγραμμα όπου θα επαναλάβουν τα βήματα ανάπτυξης μιας παραθυρικής εφαρμογής.

Διαβάστε περισσότερα

Για να δείτε όλες τις εγγραφές της εκτύπωσης μπορείτε να χρησιμοποιήσετε τα βελάκια.

Για να δείτε όλες τις εγγραφές της εκτύπωσης μπορείτε να χρησιμοποιήσετε τα βελάκια. Published on PRISMA Win Help - Megasoft (http://docs.megasoft.gr) Home > PRISMA Win Εμπορικό > Πελάτες > Εκτυπώσεις Εκτυπώσεις Λογιστικές Καρτέλα Πελάτη Στην Καρτέλα του Πελάτη εμφανίζονται αναλυτικά,

Διαβάστε περισσότερα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα 1 Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται και τυπώνει τη θέση του.

Διαβάστε περισσότερα

ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ V ΕΚΠΑΙΔΕΥΤΗΣ ΓΑΛΑΝΟΣ ΓΕΩΡΓΙΟΣ

ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ V ΕΚΠΑΙΔΕΥΤΗΣ ΓΑΛΑΝΟΣ ΓΕΩΡΓΙΟΣ 1 Ο Ι.Ε.Κ ΠΕΙΡΑΙΑ ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ V ΕΚΠΑΙΔΕΥΤΗΣ ΓΑΛΑΝΟΣ ΓΕΩΡΓΙΟΣ Δημιουργία Βάσης Δεδομένων σε Περιβάλλον VISUAL BASIC: 1. Κλικ στο Add-Ins 2. Επιλέγω Visual Data

Διαβάστε περισσότερα

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών Διδάσκων: Δρ. Γιώργος Ζάγγουλος Email: zaggoulos.george@ucy.ac.cy www.ece.ucy.ac.cy/courses/ece213 Μετατροπή ASCII σε Δεκαδικό

Διαβάστε περισσότερα

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή Στόχοι και αντικείμενο ενότητας Η έννοια του Τελεστή #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Εκφράσεις Προτεραιότητα Προσεταιριστικότητα Χρήση παρενθέσεων Μετατροπές Τύπων Υπονοούμενες και ρητές μετατροπές

Διαβάστε περισσότερα

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών Σκοπός Nα κατασκευάσουν πίνακες από δεδομένα. Να κατασκευάσουν συναρτήσεις με πίνακες. Να κάνουν χρήση

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Εισαγωγή στην Πληροφορική & τον Προγραμματισμό Ενότητα 9 η : Πίνακες & Εφαρμογές Ι. Ψαρομήλιγκος Χ. Κυτάγιας Τμήμα Διοίκησης Επιχειρήσεων

Διαβάστε περισσότερα

(3) Από την εργαλειοθήκη επιλέξτε το εργαλείο «ετικέτας (Label)». Δημιουργήστε μια ετικέτα στην φόρμα σας.

(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

Το απεικονιστικό μοντέλο μορφοποίησης των CSS Δικτυακά Πολυμέσα ΙΙ Εργαστήριο #6 0 : CSS: Χρήση των ιδιοτήτων του κουτιού (box properties). Διάταξη σελίδων Γαβαλάς Δαμιανός dgavalas@aegean.gr Το απεικονιστικό μοντέλο μορφοποίησης των CSS Περιγράφει

Διαβάστε περισσότερα

Η ιευρυµένη Επιχείρηση Ενότητα Ηλεκτρονικής Μάθησης. «CourseLab» 3ο Φροντιστήριο. Ιωάννα Ταλάντη Υπ. ιδάκτωρ, Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας

Η ιευρυµένη Επιχείρηση Ενότητα Ηλεκτρονικής Μάθησης. «CourseLab» 3ο Φροντιστήριο. Ιωάννα Ταλάντη Υπ. ιδάκτωρ, Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας Η ιευρυµένη Επιχείρηση Ενότητα Ηλεκτρονικής Μάθησης «CourseLab» 3ο Φροντιστήριο Ιωάννα Ταλάντη Υπ. ιδάκτωρ, Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας italanti@aueb.gr Actions and Events 1 Events common

Διαβάστε περισσότερα

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών Διδάσκων: Δρ. Γιώργος Ζάγγουλος Email: zaggoulos.george@ucy.ac.cy www.ece.ucy.ac.cy/courses/ece213 Ορίσματα στο QtSpim (set parameters

Διαβάστε περισσότερα

Βυζαντινός Ρεπαντής Κολλέγιο Αθηνών 2010

Βυζαντινός Ρεπαντής Κολλέγιο Αθηνών 2010 Βυζαντινός Ρεπαντής Κολλέγιο Αθηνών 2010 Δημιουργία ενός απλού παιχνιδιού με το Gamemaker (μετάφραση από το http://www.stuffucanuse.com/downloads/gamemaker-introductionlessons/free_game_downloads_gamemaker.htm)

Διαβάστε περισσότερα

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών

ΗΜΥ 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. ΕΛΕΓΧΟΙ ΕΓΚΥΡΟΤΗΤΑΣ ΣΕ ΜΙΑ ΦΟΡΜΑ

1. ΕΛΕΓΧΟΙ ΕΓΚΥΡΟΤΗΤΑΣ ΣΕ ΜΙΑ ΦΟΡΜΑ Αναλυτικά Data Validation FORM LEVEL VALIDATION - DATA LEVEL VALIDATION - επίπεδο φόρμας επίπεδο dataset 1. ΕΛΕΓΧΟΙ ΕΓΚΥΡΟΤΗΤΑΣ ΣΕ ΜΙΑ ΦΟΡΜΑ Έλεγχος εγκυρότητας δεδοµένων σε ένα Control της φόρµας event

Διαβάστε περισσότερα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Προγραμματισμός Η/Υ Ενότητα 10 η : Το αντικείμενο Συλλογή (Collection) & τα αντικείμενα ListBox, CheckedListBox & ComboBox Ι.

Διαβάστε περισσότερα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Εργαστήριο 1

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Εργαστήριο 1 ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Εργαστήριο 1 Τι είναι Βάση Δεδομένων Σύστημα διαχείρισης βάσεων δεδομένων Α σύστημα διαχείρισης βάσεων δεδομένων (ΠΔΒΔ (πρόγραμμα διαχείρισης βάσεων δεδομένων)) είναι λογισμικό υπολογιστών

Διαβάστε περισσότερα

ΛΥΚΕΙΟ ΣΟΛΕΑΣ Σχολική χρονιά 2008-2009

ΛΥΚΕΙΟ ΣΟΛΕΑΣ Σχολική χρονιά 2008-2009 ΛΥΚΕΙΟ ΣΟΛΕΑΣ Σχολική χρονιά 2008-2009 ΓΡΑΠΤΕΣ ΠΡΟΑΓΩΓΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΙΟΥΝΙΟΥ 2009 ΜΑΘΗΜΑ: ΠΛΗΡΟΦΟΡΙΚΗ ΤΑΞΗ : Β ΗΜΕΡΟΜΗΝΙΑ: Τετάρτη, 3 Ιουνίου 2009 ΩΡΑ: 07:45 10:15 ΟΔΗΓΙΕΣ: Το εξεταστικό δοκίμιο αυτό αποτελείται

Διαβάστε περισσότερα

Εισαγωγή στο πρόγραμμα Microsoft word 2003

Εισαγωγή στο πρόγραμμα Microsoft word 2003 Εισαγωγή στο πρόγραμμα Microsoft word 2003 Έναρξη 1. Εκκίνηση του προγράμματος Για να ξεκινήσουμε το Word, πατάμε στο κουμπί Εναρξη και από το μενού που εμφανίζεται επιλέγουμε Προγράμματα και Microsoft

Διαβάστε περισσότερα