XAML: modelli
Un modello descrive l'aspetto generale e l'aspetto visivo di un controllo. Ad ogni controllo è associato un modello predefinito che conferisce l'aspetto a quel controllo.
In XAML è possibile creare facilmente i propri modelli quando si desidera personalizzare il comportamento visivo e l'aspetto visivo di un controllo. La connettività tra la logica e il modello può essere ottenuta mediante l'associazione dei dati.
La principale differenza tra stili e modelli sono:
Gli stili possono modificare solo l'aspetto del controllo con le proprietà predefinite di quel controllo.
Con i modelli, puoi accedere a più parti di un controllo rispetto agli stili. È inoltre possibile specificare sia il comportamento esistente che quello nuovo di un controllo.
Esistono due tipi di modelli più comunemente utilizzati.
- Modello di controllo
- Modello di dati
Modello di controllo
Il modello di controllo definisce o specifica l'aspetto visivo e la struttura di un controllo. Tutti gli elementi dell'interfaccia utente hanno un aspetto e un comportamento, ad esempio Button ha un aspetto e un comportamento. L'evento di clic o gli eventi di passaggio del mouse sono i comportamenti che vengono attivati in risposta a un clic e al passaggio del mouse e c'è anche un aspetto predefinito del pulsante che può essere modificato dal modello di controllo.
Diamo nuovamente un'occhiata a un semplice esempio in cui vengono creati due pulsanti con alcune proprietà. Uno è contemplate e l'altro è con il default pulsante.
<Window x:Class = "TemplateDemo.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Title = "MainWindow" Height = "350" Width = "604">
<Window.Resources>
<ControlTemplate x:Key = "ButtonTemplate" TargetType = "Button">
<Grid>
<Ellipse x:Name = "ButtonEllipse" Height = "100" Width = "150" >
<Ellipse.Fill>
<LinearGradientBrush StartPoint = "0,0.2" EndPoint = "0.2,1.4">
<GradientStop Offset = "0" Color = "Red"/>
<GradientStop Offset = "1" Color = "Orange"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<ContentPresenter Content = "{TemplateBinding Content}"
HorizontalAlignment = "Center" VerticalAlignment = "Center" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property = "IsMouseOver" Value = "True">
<Setter TargetName = "ButtonEllipse" Property = "Fill" >
<Setter.Value>
<LinearGradientBrush StartPoint = "0,0.2" EndPoint="0.2,1.4">
<GradientStop Offset = "0" Color = "YellowGreen"/>
<GradientStop Offset = "1" Color = "Gold"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property = "IsPressed" Value = "True">
<Setter Property = "RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX = "0.8" ScaleY = "0.8" CenterX = "0" CenterY = "0" />
</Setter.Value>
</Setter>
<Setter Property = "RenderTransformOrigin" Value = "0.5,0.5" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Window.Resources>
<StackPanel>
<Button Content = "Round Button!" Template = "{StaticResource ButtonTemplate}"
Width = "150" Margin = "50" />
<Button Content = "Default Button!" Height = "40" Width = "150" Margin = "5" />
</StackPanel>
</Window>
Quando il codice sopra viene compilato ed eseguito, produrrà la seguente MainWindow:
Quando passi il mouse sul pulsante con il modello personalizzato, cambia anche il colore come mostrato di seguito -
Modello di dati
Un modello di dati definisce e specifica l'aspetto e la struttura della raccolta di dati. Offre la flessibilità di formattare e definire la presentazione dei dati su qualsiasi elemento dell'interfaccia utente. Viene utilizzato principalmente sui controlli Item relativi ai dati come ComboBox, ListBox, ecc.
Diamo un'occhiata a un semplice esempio di modello di dati. Il codice XAML seguente crea una casella combinata con modello di dati e blocchi di testo.
<Window x:Class = "XAMLDataTemplate.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Title = "MainWindow" Height = "350" Width = "604">
<Grid VerticalAlignment = "Top">
<ComboBox Name = "Presidents" ItemsSource = "{Binding}" Height = "30" Width = "400">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation = "Horizontal" Margin = "2">
<TextBlock Text = "Name: " Width = "95" Background = "Aqua" Margin = "2" />
<TextBlock Text = "{Binding Name}" Width = "95" Background = "AliceBlue" Margin = "2" />
<TextBlock Text = "Title: " Width = "95" Background = "Aqua" Margin = "10,2,0,2" />
<TextBlock Text = "{Binding Title}" Width = "95" Background = "AliceBlue" Margin = "2" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</Window>
Ecco l'implementazione in C # in cui l'oggetto dipendente viene assegnato a DataContext:
using System;
using System.Windows;
using System.Windows.Controls;
namespace XAMLDataTemplate {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
DataContext = Employee.GetEmployees();
}
}
}
Ecco l'implementazione in C # per la classe Employee:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace XAMLDataTemplate {
public class Employee : INotifyPropertyChanged {
private string name; public string Name {
get { return name; }
set { name = value; RaiseProperChanged(); }
}
private string title; public string Title {
get { return title; }
set { title = value; RaiseProperChanged(); }
}
public static Employee GetEmployee() {
var emp = new Employee() {
Name = "Waqas", Title = "Software Engineer" };
return emp;
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaiseProperChanged( [CallerMemberName] string caller = ""){
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(caller));
}
}
public static ObservableCollection<Employee> GetEmployees() {
var employees = new ObservableCollection<Employee>();
employees.Add(new Employee() { Name = "Ali", Title = "Developer" });
employees.Add(new Employee() { Name = "Ahmed", Title = "Programmer" });
employees.Add(new Employee() { Name = "Amjad", Title = "Desiner" });
employees.Add(new Employee() { Name = "Waqas", Title = "Programmer" });
employees.Add(new Employee() { Name = "Bilal", Title = "Engineer" });
employees.Add(new Employee() { Name = "Waqar", Title = "Manager" });
return employees;
}
}
}
Quando il codice precedente viene compilato ed eseguito, produrrà il seguente output. Contiene una casella combinata e quando fai clic sulla casella combinata, vedi che la raccolta di dati che vengono creati nella classe Employee è elencata come elementi della casella combinata.
Ti consigliamo di eseguire il codice sopra e sperimentarlo.