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:

  1. Caché fonctionnalités de C#
  2. "1519650920 des fonctionnalités Cachées de Python
  3. les traits cachés de ASP.NET
  4. "1519730920 des fonctionnalités Cachées de Perl
  5. "1519770920 des fonctionnalités Cachées de Java
  6. "1519810920 des fonctionnalités Cachées de VB.NET
  7. "1519850920 des fonctionnalités Cachées de PHP
  8. "1519890920 des fonctionnalités Cachées de Ruby
  9. Caractéristiques cachées de C
  10. Et Ainsi De Suite........
123
demandé sur Sauron 2009-07-14 15:19:55

25 réponses

Multibinding (combiné avec StringFormat):

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="{}{0}, {1}">
      <Binding Path="LastName" />
      <Binding Path="FirstName" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>
87
répondu Julien Poulin 2011-07-12 07:26:25

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 
58
répondu idursun 2009-07-14 14:15:22

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}" />
44
répondu Bryan Anderson 2009-07-14 14:02:57

3.5sp1 a introduit StringFormat dans des expressions de liaison, p.ex.

<TextBox Text="{Binding Date, StringFormat='{}{0:MM/dd/yyyy}'}" />
44
répondu Bryan Anderson 2009-09-11 03:21:18

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"/>

MSDN Link

29
répondu Prashant 2010-01-04 14:16:55

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>
27
répondu Sauron 2009-09-07 12:11:51

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 />
21
répondu Sauron 2009-09-10 12:16:37

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"/> 
19
répondu Sauron 2009-09-10 05:04:43

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>
19
répondu Sauron 2009-09-10 12:12:42

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.

18
répondu Bryan Anderson 2009-07-14 15:30:14

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)

18
répondu Thomas Levesque 2009-08-24 12:29:20

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.

15
répondu M. Dudley 2011-01-12 19:13:38

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.

14
répondu Bryan Anderson 2009-07-14 14:07:39

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>
11
répondu Sergey Aldoukhov 2010-03-05 21:27:45

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" />
10
répondu Sauron 2009-09-10 12:01:44

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>
7
répondu awe 2009-09-07 06:45:38

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/> 
6
répondu Sauron 2009-09-10 12:05:38

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" />
6
répondu Sauron 2009-09-10 12:09:04

Les Couleurs Du Système D'Utilisation

<Border Background="{DynamicResource {x:Static SystemColors.InactiveBorderBrushKey}}"/>
6
répondu SeeSharp 2010-06-15 04:20:17

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>
3
répondu Sauron 2011-01-13 15:39:56

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));
2
répondu Sauron 2009-09-10 12:21:04

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
1
répondu Sauron 2009-09-10 12:41:18

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 .

1
répondu UrbanEsc 2017-05-23 12:32:13