Les traits cachés de WPF et XAML?
voici un grand nombre de traits cachés discutés pour la variété des langues. Maintenant je suis curieux au sujet de certaines caractéristiques cachées de XAML et WPF?
un que j'ai trouvé est l'événement de clic d'en-tête D'un ListView
<ListView x:Name='lv'
Height="150"
GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">
The GridViewColumnHeader.Cliquez sur la propriété n'est pas répertorié.
certaines des caractéristiques pertinentes à ce jour:
Voir aussi:
- Caché fonctionnalités de C#
- "1519650920 des fonctionnalités Cachées de Python
- les traits cachés de ASP.NET
- "1519730920 des fonctionnalités Cachées de Perl
- "1519770920 des fonctionnalités Cachées de Java
- "1519810920 des fonctionnalités Cachées de VB.NET
- "1519850920 des fonctionnalités Cachées de PHP
- "1519890920 des fonctionnalités Cachées de Ruby
- Caractéristiques cachées de C
- Et Ainsi De Suite........
25 réponses
Multibinding (combiné avec StringFormat):
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}, {1}">
<Binding Path="LastName" />
<Binding Path="FirstName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Il ya aussi Présentationtracesources.TraceLevel truc pour déboguer ce qui se passe avec les fixations dans n'importe quel scénario particulier. Tout ce que vous avez à faire est de référencer le système.Espace de nommage des Diagnostics dans l'assemblage de la base de données WindowsBase
xmlns:sd="clr-namespace:System.Diagnostics;assembly=WindowsBase"
et ajouter ce qui suit à l'expression liant:
<TextBlock Text="{Binding Message, sd:PresentationTraceSources.TraceLevel=High}" />
Log sera comme ceci:
System.Windows.Data Warning: 52 : Created BindingExpression (hash=5923895) for Binding (hash=7588182)
System.Windows.Data Warning: 54 : Path: 'Message'
System.Windows.Data Warning: 56 : BindingExpression (hash=5923895): Default mode resolved to OneWay
System.Windows.Data Warning: 57 : BindingExpression (hash=5923895): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 58 : BindingExpression (hash=5923895): Attach to System.Windows.Controls.TextBlock.Text (hash=65248697)
System.Windows.Data Warning: 63 : BindingExpression (hash=5923895): Resolving source
3.5sp1 a introduit TargetNullValue pour les reliures. La propriété liée sera alors définie à Null si la valeur est entrée et si votre propriété est nulle, elle affichera cette valeur.
<TextBox Text="{Binding Total, TargetNullValue="151900920".00}" />
3.5sp1 a introduit StringFormat dans des expressions de liaison, p.ex.
<TextBox Text="{Binding Date, StringFormat='{}{0:MM/dd/yyyy}'}" />
parfois, vous obtenez chaîne qui est trop long à montrer sur l'étiquette. Dans ce cas, nous pouvons faire usage de TextTrimming
propriété de TextBlock
pour montrer des Ellipses
<TextBlock
Name="sampleTextBlock"
TextTrimming="WordEllipsis"
TextWrapping="NoWrap"/>
ajout de L'effet Aero à la fenêtre
<Window.Resources>
<ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
</Window.Resources>
Génériques en XAML avec x:TypeArguments
si vous voulez utiliser une collecte observable dans XAML, vous devez créer un type qui dérive de la collecte observable parce que vous ne pouvez pas la déclarer dans XAML. Avec XAML 2009, vous pouvez utiliser l'attribut x:TypeArguments pour définir le type d'un type générique.
<!-- XAML 2006 -->
class EmployeeCollection : ObservableCollection<Employee>
{
}
<l:EmployeeCollection>
<l:Employee FirstName="John" Name="Doe" />
<l:Employee FirstName="Tim" Name="Smith" />
</lEmployeeCollection>
<!-- XAML 2009 -->
<ObservableCollection x:TypeArguments="Employee">
<l:Employee FirstName="John" Name="Doe" />
<l:Employee FirstName="Tim" Name="Smith" />
</ObservableCollection />
afficher le Tooltip sur une commande désactivée
Wpf permet de montrer tooltip sur un contrôle, s'il est en état de désactivation.
par exemple
<Button Content="Disabled Button" ToolTipService.ShowOnDisabled="True" IsEnabled="False" ToolTip="This is a disabled button"/>
l'Utilisation de la Non-Constructeurs par Défaut avec x:Arguments
Dans le code XAML 2006 des objets doit avoir un constructeur par défaut public à les utiliser. Dans XAML 2009, vous pouvez passer les arguments du constructeur en utilisant la syntaxe X:Arguments.
<!-- XAML 2006 -->
<DateTime>00:00:00.0000100</DateTime>
<!-- XAML 2009 -->
<DateTime>
<x:Arguments>
<x:Int64>100</x:Int64>
</x:Arguments>
</DateTime>
pas vraiment une caractéristique cachée, mais avec WPF / XAML vous obtenez Bea Stollnitz et Josh Smith . La reine et le Roi de WPF/XAML de programmation.
Markup extensions et propriétés attachées sont mes caractéristiques préférées, ils vous permettent d'étendre XAML "vocabulaire" d'une manière très élégante.
extensions de Balisage
<!-- Binding to app settings -->
<CheckBox IsChecked="{my:SettingBinding MinimizeToTray}">Close to tray</CheckBox>
<!-- Fill ItemsControl with the values of an enum -->
<ComboBox ItemsSource="{my:EnumValues sys:DaysOfWeek}"/>
<!-- Localization -->
<TextBlock Text="{my:Localize HelloWorld.Text}"/>
<!-- Switch on the result of a binding -->
<TextBlock Text="{my:Switch Path=IsGood, ValueIfTrue=Good, ValueIfFalse=Bad}"/>
Attaché "propriétés de la 151970920"
<!-- Sort GridView automatically -->
<ListView ItemsSource="{Binding Persons}"
IsSynchronizedWithCurrentItem="True"
util:GridViewSort.AutoSort="True">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Name"
DisplayMemberBinding="{Binding Name}"
util:GridViewSort.PropertyName="Name"/>
<GridViewColumn Header="First name"
DisplayMemberBinding="{Binding FirstName}"
util:GridViewSort.PropertyName="FirstName"/>
<GridViewColumn Header="Date of birth"
DisplayMemberBinding="{Binding DateOfBirth}"
util:GridViewSort.PropertyName="DateOfBirth"/>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
<!-- Vista Glass effect -->
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:WpfApplication1"
Title="Window1"
my:WinUtil.EnableAeroGlass="True">
...
Source GridViewSort (btw, il utilise le GridViewColumnHeader.Click
événement mentionné par Ortus)
vous pouvez vous référer aux types imbriqués dans XAML en utilisant le signe plus ( +
). Par exemple, si nous avions cette classe:
public class SomeClass
{
public enum SomeEnum
{
SomeValue
};
}
nous pourrions faire référence à SomeValue
dans XAML en utilisant la syntaxe suivante:
{x:Static local:SomeClass+SomeEnum.SomeValue}
cette syntaxe est non documentée sur MSDN , et elle n'est pas officiellement prise en charge. Quelqu'un a demandé à ce sujet sur les forums MSDN, et apparemment il casse Concepteur WPF VS2010. Il a été rapporté sur Microsoft Connect.
taille de la Grille de partage ( voici un bon exemple). Pour faire court, vous pouvez avoir des colonnes de grille et des lignes partageant des tailles, même à travers des grilles différentes. Cela sera d'une valeur inestimable pour toutes les personnes qui utilisent DataGrids sans avoir besoin de modifier les données en place.
PriorityBinding . Permet d'utiliser asyn bindings dans un ordre de "premier arrivé, premier show":
<TextBlock.Text>
<PriorityBinding FallbackValue="defaultvalue">
<Binding Path="SlowestDP" IsAsync="True"/>
<Binding Path="SlowerDP" IsAsync="True"/>
<Binding Path="FastDP" />
</PriorityBinding>
</TextBlock.Text>
utilisation de méthodes D'usine statiques avec X: méthode Factorym
lorsque vous avez un type qui n'a pas de constructeur public mais une méthode d'usine statique, vous avez dû créer ce type de code dans XAML 2006. Avec XAML 2009, vous pouvez utiliser l'attribut X:FactoryMethodx: Arguments pour passer les valeurs des arguments.
<!-- XAML 2006 -->
Guid id = Guid.NewGuid();
<!-- XAML 2009 -->
<Guid x:FactoryMethod="Guid.NewGuid" />
Avancé "légende" propriétés
une autre chose qui n'est pas très claire est le contenu de certaines propriétés que nous sommes habitués à ne contenir que du texte. Si la propriété D'un élément GUI est de type Object, il est très probable que vous pouvez, au lieu de simplement configurer le texte, Ajouter un panneau de votre besoin qui inclut un ensemble de contrôles.
un exemple de cela est le MenuItem, où la propriété Header
(qui normalement ne contient que du texte) peut contenir un ensemble d'éléments graphiques enveloppé dans un panneau de contrôle (ou juste un élément graphique si vous avez besoin d'un seul).
voir aussi la propriété Icon
sur le MenuItem. Cela contient normalement un élément Image, mais cela peut aussi contenir n'importe quoi!
<MenuItem Name="MyMenuItem" Click="MyMenuItem_Click">
<MenuItem.Icon>
<Button Click="Button1_Click">i</Button>
</MenuItem.Icon>
<MenuItem.Header>
<StackPanel Orientation="Horizontal" >
<Label>My text</Label>
<Button Click="Button2_Click">ClickMe!</Button>
</StackPanel>
</MenuItem.Header>
</MenuItem>
Convertisseurs XAML
la liste suivante montre les convertisseurs développés par la communauté WPF pour convertir différents formats en XAML ou vice versa.
Adobe Illustrator XAML Export Plugin
Adobe Photoshop pour XAML "Convertisseur de 151980920"
3D Studio Max to XAML Converter
Maya à XAML "Convertisseur de 151980920"
Flash XAML "Convertisseur de 151980920"
types encastrés
si vous voulez ajouter des objets de types simples comme string ou double à un dictionnaire de ressources aujourd'hui, vous devez mapper les espaces clr-Nam nécessaires à des espaces de noms XML. Dans XAML 2009 nous avons beaucoup de types simples qui sont inclus dans la langue XAML.
<!-- XAML 2006 -->
<sys:String xmlns:sys="clr-namespace:System;assembly=mscorlib >Test</sys:String>
<!-- XAML 2009 -->
<x:String>Test</x:String>
les types suivants sont inclus dans la langue XAML:
<x:Object/>
<x:Boolean/>
<x:Char/>
<x:String/>
<x:Decimal/>
<x:Single/>
<x:Double/>
<x:Int16/>
<x:Int32/>
<x:Int64/>
<x:TimeSpan/>
<x:Uri/>
<x:Byte/>
<x:Array/>
<x:List/>
<x:Dictionary/>
Facile Références de l'Objet avec {x:Référence}
si vous voulez créer une référence objet aujourd'hui vous devez faire une reliure de base de données et déclarer la source avec un nom D'élément. Dans XAML 2009 vous pouvez utiliser le nouveau {x: Reference} markup extension
<!-- XAML 2006 -->
<Label Target="{Binding ElementName=firstName}">FirstName</Label>
<TextBox x:Name="firstName" />
<!-- XAML 2009 -->
<Label Target="{x:Reference firstName}">FirstName</Label>
<TextBox x:Name="firstName" />
Les Couleurs Du Système D'Utilisation
<Border Background="{DynamicResource {x:Static SystemColors.InactiveBorderBrushKey}}"/>
le Soutien à l'Arbitraire Clés de Dictionnaire
Dans le code XAML 2006 tous explicite x:valeur de la Clé ont été traités comme des chaînes de caractères. Dans XAML 2009 vous pouvez définir n'importe quel type de clé que vous aimez en écrivant la clé dans ElementSyntax.
<!-- XAML 2006 -->
<StreamGeometry x:Key="CheckGeometry">M 0 0 L 12 8 l 9 12 z</StreamGeometry>
<!-- XAML 2009 -->
<StreamGeometry>M 0 0 L 12 8 l 9 12 z
<x:Key><x:Double>10.0</x:Double></x:Key>
</StreamGeometry>
définir une ValidationError par Code
une ValidatioRule dans une Expressionbindling ne se déclenche que lorsque le côté cible de la liaison change. Si vous voulez définir une erreur de validation par code, vous pouvez utiliser l'extrait suivant.
définir l'erreur de validation
ValidationError validationError =
new ValidationError(regexValidationRule,
textBox.GetBindingExpression(TextBox.TextProperty));
validationError.ErrorContent = "This is not a valid e-mail address";
Validation.MarkInvalid(
textBox.GetBindingExpression(TextBox.TextProperty),
validationError);
Effacer l'erreur de validation
Validation.ClearInvalid(textBox.GetBindingExpression(TextBox.TextProperty));
La Capacité de Trucs UIElement(s) dans un TextBlock
Je ne sais pas à quel point c'est utile (mais cela peut être caché)... mais ça m'a pris par surprise quand j'ai rencontré pour la première fois :
<Grid x:Name="LayoutRoot">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
<Grid>
<Rectangle Fill="AliceBlue" Width="25" Height="25"/>
</Grid>
</TextBlock>
</Grid>
vous pourriez argumenter que le xaml suivant pourrait être utile (c.-à-d. mettre un graphique à la fin de quelque texte):
<Grid>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Hello World">
<TextBlock.Resources>
<DrawingBrush x:Key="exclamationPoint" Stretch="Uniform">
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<GeometryDrawing Brush="#FF375CE2" Geometry="F1 M 7.968,58.164L 0,58.164L 1.914,49.921L 9.882,49.921L 7.968,58.164 Z M 21.796,0L 11.054,42.148L 4.403,42.148L 13.049,0L 21.796,0 Z "/>
</DrawingGroup.Children>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</TextBlock.Resources>
<Grid>
<Rectangle Width="100" Height="100" Fill="{StaticResource exclamationPoint}"/>
</Grid>
</TextBlock>
</Grid>
le XAML ci-dessus rend comme le suivant:
Débogage Des Animations
Erreurs Courantes
Si vous obtenez l'erreur suivante: Impossible d'animer '(0).(1) ' sur une instance d'objet immuable. il se peut que vous rencontriez l'une des limitations suivantes:
- vous animez une propriété de dépendance sans définir de valeur locale
- vous animez une propriété de dépendance dont la valeur actuelle est définie dans une autre assemblée qui n'est pas fusionné dans le dictionnaire de ressources.
- vous animez une valeur qui est actuellement la base de données
reliure sans INotifyPropertyChanged ou DependencyProperties
Comme discuté de la ici vous pouvez lier une plaine CLR propriété de l'objet sans INotifyPropertyChanged, et il sera le fonctionne .
Voici the Forumpost je fais référence à.
citation:
[...] WPF liaison de données le moteur liera les données à L'instance PropertyDescriptor qui enveloppe la propriété source si l'objet source est un simple objet CLR et n'implémente pas l'interface INotifyPropertyChanged. Et le moteur de liaison de données va essayer de s'abonner à l'événement de propriété modifié par PropertyDescriptor.Méthode AddValueChanged (). Et lorsque l'élément cible lié aux données change les valeurs de propriété, le moteur de liaison de données appellera PropertyDescriptor.Méthode SetValue () pour transférer la valeur changée vers la la propriété source, et il soulèvera simultanément L'événement ValueChanged pour aviser les autres abonnés (dans ce cas, les autres Abonnés seront les blocs de texte dans la boîte de liste.
et si vous implémentez INotifyPropertyChanged, vous êtes entièrement responsable d'implémenter la notification de changement dans chaque setter des propriétés qui doivent être liées aux données de L'UI. Sinon, le changement sera pas synchronisé comme vous le souhaitez.[...]
voici un autre grand et détaillé article sur le sujet.
Note cela ne fonctionne qu'avec la liaison . Si vous mettez à jour les valeurs à partir du code , le changement ne sera pas notifié . [...]
mise en œuvre INotifyPropertyChanged peut être un peu de travail de développement fastidieux. Cependant, vous aurez besoin de peser ce travail contre l'empreinte d'exécution (mémoire et CPU) de votre application WPF. implémenter vous-même INPC sauvera L'exécution du CPU et la mémoire .