Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Ultimamente sto passando alla realizzazione di piccole applicazione wpf, utilizzando il linguaggio vb, sto iniziando a personalizzare il template, la parte grafica, degli elementi presenti nella finestra, tra qui la finestra stessa, per fare questo ho semplicemente fatto uno stile che leva il bordo alla finestra e la rende trasparente, per poi disegnarsi sopra, con forme, bordi e altro.., tutto questo modificando il codice all'interno del file Application.xaml in questo modo:
A questo punto mi basterebbe richiamare lo stile appena realizzato e tutto funziona, avrei solamente delle piccole domande:
Nel mio template ho messo un textblock che dovrebbe contenere il titolo dell'applicazione, come posso far si che il testo di questa textblock sia identico al valore della proprietà title di Window ( la finestra dell'applicazione )?
Dopo aver fatto queste modifiche nell'xaml principale ( quella dell'applicazione ) non mi visualizza più, all'interno del tag <Window> il tag <grid>, almeno che non lo inserisco io manualmente, come mai questo?
E' possibile fare in modo che, la finestra mi abbia di default questo template, senza che lo richiamo tramite l'attributo style?
Non so se sono stato abbastanza chiaro con le mie domande, ma e da parecchi giorni che cerco delle risposte su internet senza nessun risultato.
Ciao per la prima domanda hai due soluzioni:
1) usare il pattern MVVM quindi creare un viewmodel e bindare la proprietà Text del textblock ad una proprietà del viewmodel e poi il titolo della finestra alla proprietà di prima;
2) penso che tu protesti farlo anche via codice, anche se te lo sconsiglio...
ecco la riusposta alla tua seconda domanda, facendo così la finestra sarà sempre come chiedi senza applicare nessun stile. Poi vedi che le proprietà Text del TextBloc è bindata ad un'altra proprietà definita nel viewmodel e come vedi anche la proprietà title è bindata alla stessa proprietà Titolo del viewmodel...
questo è il viewmodel:
Codice sorgente - presumibilmente Delphi
using GalaSoft.MvvmLight;
namespace WpfApplication3.ViewModel
{
/// <summary>
/// This class contains properties that the main View can data bind to.
/// <para>
/// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
/// </para>
/// <para>
/// You can also use Blend to data bind with the tool's support.
/// </para>
/// <para>
/// See http://www.galasoft.ch/mvvm
/// </para>
/// </summary>
public class MainViewModel : ViewModelBase
{
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel()
{
Titolo = "Ciao mondo";
}
privatestring _titolo { get; set; }
publicstring Titolo
{
get { return _titolo; }
set
{
_titolo = value;
RaisePropertyChanged("Titolo");
}
}
}
}
una volta che la proprietà Titolo viene cambiata anche le varie proprità bindate ad esse vengono cambiate.
L'altra soluzione era quella di dichiarare il Textblock nel seguente modo:
Il primo blocco di codice è lo XAML della finestra principale, è meglio se usi la seconda soluzione, è sufficiente dare un nome al TextBlock è poi usarlo nel c# come se lo avessi già dichiarato...
Ma io non sto facendo l'applicazione wpf in C#, ma in VB, lo scritto anche nel titolo, cmq non mi funziona neanche il secondo metodo, nel codice non mi riconosce il nome della textblock, ora cmq sto riprovando
Ciao, c# o vb non cambia, il problemi sono:
1) hai modificato lo XAML? Hai dichiarato le proprietà della finestra dentro il tag Window?
2) dove vai a modificare la proprietà Text del textBlock, devi farlo nella file *.cs associato allo XAML della finestra, praticamente nella classe parziale della tua window.
Per il linguaggio mi riferivo al codice che mi hai postato te, non sapevo come riscriverlo in vb, cmq non fa niente, opto per il secondo metodo da te postato.
Come scritto da te, la textblock, lo dichiarata nel file Application.xaml, dove si trova lo stile del template, lo dichiarata in questo modo:
In genere quando si vuole applicare uno stile a tutti i controlli di un tipo, si definisce lo style senza x:key, fornendo solamente il parametro TargetType
Nel caso della window però abbiamo una classe, es. MainWindow, che eredita da window. Gli styles vengono applicati solamente alle classi per cui sono stati creati, senza estensione alle classi derivate.
Per questo andrebbe definito uno stile per ogni classe che eredita da window. Nel caso di MainWindow:
importi nello xaml di application il namespace che contiene la classe che eredita da window (io l'ho chiamato local) e definisci uno stile tipo questo:
altrimenti devi assegnare una key allo stile, e far si che ogni tua finestra abbia un metodo per pescare lo stile dalle risorse e impostarlo tramite code behind come ti ha consigliato qualcuno prima di me (però appunto non sarà visibile dal designer)
se hai dubbi chiedi
Ultima modifica effettuata da Dedalux il 18/09/2012 alle 21:22
Per il linguaggio mi riferivo al codice che mi hai postato te, non sapevo come riscriverlo in vb, cmq non fa niente, opto per il secondo metodo da te postato.
Come scritto da te, la textblock, lo dichiarata nel file Application.xaml, dove si trova lo stile del template, lo dichiarata in questo modo:
Nel codice, precisamente nella runtime Window_Loaded, inserisco questo codice:
Codice sorgente - presumibilmente Plain Text
winTitle.Text = Me.Title
Ma mi dice che winTitle non è dichiarata, dovrei far in modo che me la riconosca o dovrei inserire il codice da qualche altra parte?
Ciao, guarda che il textblock nell'esempio che ti ho riportato lo dichiaro all'interno della Window, altrimenti non lo trova, poi se non usi la seconda soluzione non serve che nella definizione del TexBlock scrivi
ora non ne sono sicuro ma se dichiari il textblock all'interno di un template non penso tu possa usarlo da codice(più ci penso e più ne sono sicuro ), guarda bene il mio primo codice(che ti ripropongo):