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

    [WPF VB.NET] Applicazione di un stile a Window

    ciao, è possibile applicare attraverso uno stile i seguenti elementi ad una window in wpf?

    <Border x:Name="m_edgeBorder" x:FieldModifier="private" Margin="10" Background="White" IsHitTestVisible="True" IsEnabled="False">
    <Border.Effect>
    <DropShadowEffect Opacity="0.999" BlurRadius="16" ShadowDepth="0" />
    </Border.Effect>
    <Button HorizontalAlignment="Right" Margin="500,6,8,0" VerticalAlignment="Top">
    <TextBlock TextWrapping="Wrap" Text="r" FontFamily="Webdings" Foreground="#FF919191" FontSize="13.333" />
    </Button>
    </Border>

    ovvero quando una finestra viene caricata ceve mostrare questi elementi.

    premetto che ho appena iniziato con wpf e gli stili.

    Grazie e ciao

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    premetto che non si capisce bene cio che vuoi fare.

    Per visualizzare gli elementi si puo semplicemente inserirli nella window o in un altro contenitore. Ti illustro in ordine di complessità quali possibilità di personalizzazione hai con wpf.

    - Gli stili servono solo per modificare l'aspetto del SINGOLO elemento.

    - Se vuoi modificare il modo con cui l'elemento viene visualizzato in maniera piu radicale allora devi ridefinire il CONTROLTEMPLATE dell'elemnto. Modificare il controltemplate non è semplicemente "dire di quali elementi semplici è fatto uno piu complesso" ma anche gestire i sui "stati" e "transazioni".

    - Oppure puoi costruire uno USERCONTROL cioè un controllo utente fatto da piu controlli standard e usare l'usercontrol come se fosse un controllo normale. Puoi anche ridefinire nuove Dependency Property e RoutedEvents, specifiche del controllo o wrappare quelle dei controlli interni. Questo sembra piu vicino al tuo caso, almeno da cio che ho capito io.

    - Infine puoi costruire un CUSTOMCONTROL. Questo è il caso piu complesso ma che ti offre il massimo della flessibilità. Il customControl non ha un look and fel ma è semplicemente una classe che ne descrive il comportamento e gli stati. Il customControl si completa fornendo un controlTemplate di default e sarà cura poi di chi lo utilizza ridefinire eventualmente il controlTemplate aderendo al comportamento e agli stati del customControl da te definiti.

    ognuno di questi argomenti è abbastanza vasto. Inoltre ti consiglio di studiare almeno fino ai controlTemplate senza fermarti agli stili. Inutile dire che devi masticare bene il Binding e la sua sintassi perche i Template ne fanno largo uso.

  3. #3
    grazie per la risposta, mi hai chiarito sinteticamente molti aspetti.

    per quanto riguarda quello che cerco di fare, guarda il seguente codice.
    Definisce un template per le textbox così che basta creare una nuova textbox ed impostare lo style per inglobargli anche gli elementi border e grid , allo stesso modo vorrei poter creare una window (anche a runtime) ed impostargli lo style inglobando gli elementi descritti nel post precedente (border con shadow)



    codice:
    <Style x:Key="stile_TextBox" TargetType="TextBox">
                <Setter Property="FontFamily" Value="Calibri" />
                <Setter Property="FontSize" Value="18" />
                <Setter Property="Height" Value="Auto" />
                <Setter Property="HorizontalContentAlignment" Value="Left" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate
                        TargetType="{x:Type TextBox}"
                        x:Name="MainControlTemplate"
                        >
                            <Border
                            x:Name="Border"
                            Margin="5"
                            Padding="2"
                            CornerRadius="2"
                            BorderThickness="0"
                            BorderBrush="#FFCCCCCC"
                            Background="White"
                            SnapsToDevicePixels="True"
                            >
                                <Grid>
                                    <ScrollViewer 
                                    x:Name="PART_ContentHost" 
                                    VerticalAlignment="Center"
                                    HorizontalAlignment="Left"
                                    Margin="0"
                                    />
                                </Grid>
                                <Border.Effect>
                                    <DropShadowEffect
                                    x:Name="BorderShadow"
                                    RenderingBias="Performance"
                                    ShadowDepth="0"
                                    BlurRadius="10"
                                    Color="#FFCCCCCC"
                                    />
                                </Border.Effect>
                            </Border>
                            <ControlTemplate.Resources>
                                <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#FF999999" />
                                <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#FFCCCCCC" />
                            </ControlTemplate.Resources>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsEnabled" Value="False">
                                    <Setter TargetName="Border" Property="Background" Value="{DynamicResource DisabledBackgroundBrush}" />
                                    <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}" />
                                </Trigger>
    
                                
                                <EventTrigger RoutedEvent="TextBox.GotFocus">
                                    <EventTrigger.Actions>
                                        <BeginStoryboard>
                                            <Storyboard>
                                                <ColorAnimation
                                                Storyboard.TargetName="BorderShadow"
                                                Storyboard.TargetProperty="Color"
                                                To="Red" 
                                                Duration="0:0:0.2"
                                                />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </EventTrigger.Actions>
                                </EventTrigger>
    
                                <EventTrigger RoutedEvent="TextBox.LostFocus">
                                    <EventTrigger.Actions>
                                        <BeginStoryboard>
                                            <Storyboard>
                                                <ColorAnimation
                                                Storyboard.TargetName="BorderShadow"
                                                Storyboard.TargetProperty="Color"
                                                To="#FFCCCCCC"   
                                                Duration="0:0:0.2"
                                                />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </EventTrigger.Actions>
                                </EventTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Il miglior modo per ridefinire il control template di un controllo è farlo sulla base del suo template di default. Per conoscere il template di default, o visual tree di un controllo devi usare un software tipo wpfInspector.

    wpfinspector.codeplex.com

    Si clicca su un elemento e wpfinspector ti da tra le altre cose, il control template.

    Ovviamente aspettati che il controltemplate di una finestra sia molto più elaborato di quello di una textbox.
    Basta copiaincollare il template da wpf inspector ed effettuare le modifiche lasciandosi guidare da cio che gia c'è. Allenati su template più semplici (tipo fare una textblock bordata) per capire come funziona.

    Quello che però è importante capire è che agendo sul visualtree si conservano i comportamenti del controllo. Posso agire sul template di una textbox quanto voglio ma il suo comportamento sarà quello di una textbox, non posso aggiungerne di nuovi. Lo stesso vale per tutto il resto.

    Che ruolo avranno i pulsanti e le textbox che tu vuoi inserire nel controltemplate di una window? se si tratta di modificare l'aspetto della stessa e mantenere il suo comportamento allora ok altrimenti sei sulla strada sbagliata e devi ripiegare sugli usercontrol (o customControl ma raramente questi vengono scomodati)

  5. #5
    Il mio obiettivo ė quello di ridefinire lo stile di una window, ovviamente mantenendo le caratteristiche di base.
    Per fare ciò, inizialmente ho pensato di utilizzare metro apps per wpf, scaricato tutto su VS10 ho visto che non funzionava e dopo un po di google ho capito che funziona solo con VS12 per windows8.

    In conclusione: vorrei ridefinire una window ed applicare il nuovo stile o template in maniera semplice a tutte le window senza dover inserire ogni volta i controlli e le funzioni su xaml o code behind, cosa mi consigli?

  6. #6
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    ok allora fai come ti ho detto: ridefinisci lo stile della finestra tra cui il control template. Dentro ci copiincolli il control template di default (preso da wpfinspector) e inizi a modificare i vari elementi che la compongono.

  7. #7
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    giusto per concludere il 3d. Non ho su questo pc wpf inspector ma ho trovato questo esempio su msdn (nel menu a sx è pieno di esempi di control template ):

    http://msdn.microsoft.com/en-us/library/aa969824(v=vs.85).aspx

    sinceramente pensavo peggio per una finestra invece si puo fare un esempio abbastanza semplice. dunque,

    se guardi la prima parte c'è un adorner che semplicemente contiene il contentpresenter che fa da placeholder (ci deve essere in tutti i template di controlli contenitori) e in sovrapposizione il resizegrip (in sovrapposizione perché il grid è a una cella per cui più elementi in una cella si sovrappongono).

    A parte il contentpresenter l'unico controllo presente ha ragione di essere in quanto interagisce con il comportamento della finestra, è il resizegrip. Per comportamento intendo soprattutto i trigger ma potrebbe anche essere una proprietà. In questo esempio si agisce sul resizegrip in base ad un trigger della window.

    Potresti creare un grid più complesso, inserirci dentro diversi elementi ma sei limitato a tre possibilità:
    - elementi statici: es. un logo, un testo che rimangono fissi e con cui non puoi interagire dall'esterno.
    - elementi che reagiscono con i trigger del controllo. L'esempio è proprio il resizegrip a cui si imposta la visibilità in base al valore della proprietà che indica la possibilità di fare il resize.
    -elementi bindati attraverso il TemplateBinding ad una proprietà della window.

    per esempio volendo inserire una label che conterrà il titolo della finestra puoi inserire

    <label Text="{TemplateBinding Title}" />

    Il binding tra controlli come quello di sopra è incrediblmente versatile perche potresti anche sbizzarirti con i valueconverter ma non so se gli hai gia visti. Si tratta di dare la possibilità di bindare una proprietà di un tipo (es. testo) a proprietà di un altro tipo (es.color).

    Quello che non puoi fare è contare su proprietà personalizzate, o comportamenti non previste dal controllo window.

    Concludo dicendo che l'esempio sopra sicuramente non contiene l'elenco di tutti i trigger di Window, ispeziona una Window con wpf inspector cosi scoprirai altri trigger con cui far interagire ulteriori controlli interni della tua personalizzazione.


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.