Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [VB.NET/WPF] Gestione Controllo da codice

    Ciao a tutti, sono nuovo al mondo WPF. Ho incontrato i miei primi problemi nel gestire un controllo da me creato cercando di modificarne il layout. Mi spiego meglio.
    Partendo da un controllo di tipo Button ne ho modificato il template a mio piacimento aggiungendovi altri controlli al suo interno (es: Border, ContentPresenter, etc..), una volta fatto ciò ho creato una nuova StoryBoard (utilizzando Expression Blend 3) che mi permetteva di cambiare l'aspetto del mio bottone quando questo risultava disabilitato o ancora quando il mouse si trovava al suo interno.
    Quello che mi chiedo ora è: come fare a modificare i controlli presenti nel template del mio bottone? E ancora: Come fare a modificare l'aspetto del mio bottone relativamente all'animazione creata (es: se l'animazione permetteva al bottone di cambiare background da nero a bianco una volta che il mouse gli era sopra, come faccio a modificare dinamicamente da codice il colore bianco con un altro colore a mio piacimento?)


    Grazie

    Piccola precisazione: il mio controllo l'ho creato attraverso una Custom Control Library al cui interno ho aggiunto un UserControl. E' questo il modo corretto di fare per la creazione di controlli personalizzati? O sarebbe stato meglio l'utilizzo di una User Control Library?


    EDIT: Sezione sbagliata...
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Con wpf puoi personalizzare l'aspetto dei controlli in diversi modi: in modo leggero agendo sulle sue proprietà (magari applicando gli stili), piu in profondità ridefinendo il controltemplate, in modo ancora piu flessibile costruendo uno usercontrol. Se tutto cio non bastasse si puo anche costruire un customcontrol (ma è un altra storia).
    A questo punto devi scegliere tra le tre strade (stili, controltemplate, usercontrol).

    Da quel che mi pare di capire quello che ti serve è la strada di mezzo e cioè ridefinire il control template. Questo va ridefinito come risorsa esterna e successivamente associato al controllo che si vuole ridefinire.

    ora ti posto un controltemplate di un pulsante cosi cerco di rispondere a qualche tua domanda:

    codice:
    <ControlTemplate x:Key="TemplateBtn" TargetType="Button">
                <Border x:Name="BtnBorder"
                        BorderThickness="3" 
                        CornerRadius="2" 
                        BorderBrush="Blue" 
                        Background="{TemplateBinding Background}" 
                        TextBlock.Foreground="Blue">
                    <Grid>
                        <Rectangle Name="FocusRect"
                                   Visibility="Hidden"
                                   Stroke="Green"
                                   StrokeDashArray="1 2"
                                   StrokeThickness="1"/>
                        <ContentPresenter 
                        RecognizesAccessKey="True"
                        Margin="{TemplateBinding Padding}">
                        </ContentPresenter>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="BtnBorder" Property="Background" Value="Green" />
                        <Setter TargetName="BtnBorder" Property="TextBlock.Foreground" Value="White" />
                    </Trigger>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter TargetName="FocusRect" Property="Visibility" Value="Visible" />
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="BtnBorder" Property="TextBlock.Foreground" Value="Gray" />
                        <Setter TargetName="BtnBorder" Property="Background" Value="MistyRose" />
                    </Trigger>
    
                    <EventTrigger RoutedEvent="MouseEnter">
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="BtnBorder"
                                                Storyboard.TargetProperty="Background.Color"
                                                To="DarkMagenta"
                                                Duration="0:0:1"
                                                RepeatBehavior="Forever"
                                                AutoReverse="True" />
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="MouseLeave">
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="BtnBorder"
                                                Storyboard.TargetProperty="Background.Color"
                                                Duration="0:0:5" />
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
    è cosi crei i pulsanti:

    codice:
    <StackPanel Width="200">
                <Button Content="_Prova" Margin="15" Padding="5" Background="LawnGreen"
                        Template="{StaticResource TemplateBtn}">
                </Button>
                <Button Content="_Prova" Margin="15" Padding="5" Background="Khaki"
                        Template="{StaticResource TemplateBtn}">
                </Button>
                <Button Content="_Prova" Margin="15" Padding="5" IsEnabled="False"
                        Template="{StaticResource TemplateBtn}">
                </Button>
            </StackPanel>

    la prima parte, il border, rappresenta la grafica del controllo. La cosa su cui dovresti prestare attenzione è il modo con cui "prelevo" alcuni settaggi che mi vengono passati in fase di dichiarazione del pulsante per ridefinire altre proprietà degli elementi grafici:

    Margin="{TemplateBinding Padding}"

    significa che il margine del contentpresenter non lo conosco a priori ma è di volta in volta uguale al padding che mi viene fornito quando dichiaro il pulsante (che poi sarebbe il comportamento che deve avere).

    Background="{TemplateBinding Background}"

    Stesso discorso, il bacground del border lo pesco da cio che mi viene fornito all'atto della dichiarazione.

    La seconda parte, i triggers, parla da sola. E' un elenco di operazioni da compiere ogni volta che si verifica un evento spcificato dallo stato in cui si trova una specifica proprietà.
    La cosa interessante qui è che non c'è bisogno di "salvare" lo stato visuale degli oggetti prima di modificarli, infatti quando il trigger non sussiste piu, wpf riporta tutto allo stato precedente. Per capirci quando IsPressed torna a false, è WPF che riporta i colori a posto, tu non te ne devi preoccupare.

    Per gli eventTriggers valgono le stesse considerazioni dei triggers, qui ci ho messo le animazioni, Poichè il colore di sfondo iniziale non è fisso ma viene prelevato con il TemplateBinding l'animazione cambierà in base al valore che viene impostato all'atto della dichiarazione. Se voglio che al mouseLeave le cose ritornino allo stato originale con un animazione allora devo ridefinire anche questo evento ma la cosa bella è che non devo preoccuparmi di dire qual era il colore originale, devo specificare solo il tempo di durata (e ovviamente la proprietà su cui agire)

    P.S.
    Se qualcuno ha da ridire sulle mie "doti" artistiche prema alt-f4

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.