2009-07-23 6 views
1

En utilisant XAML, j'essaie d'obtenir une zone de liste pour afficher la liste des polices système.Liaison de données WPF - Affichage de la liste des polices système

Je ne sais pas exactement quoi écrire dans la chaîne Bindings.

Voilà ma tentative:

<Window x:Class="ListDataBinding.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:m="clr-namespace:System.Windows.Media;assembly=PresentationCore" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <ListBox ItemsSource="{Binding Source={StaticResource m:Fonts.SystemFontFamilies}}"></ListBox> 

    </Grid> 
</Window> 

Je reçois une erreur: Impossible de trouver ressource nommée '{m: Fonts.SystemFontFamilies}'

Je me demande ce que je devrais taper. Je n'ai pas réussi à trouver une page MSDN utile à ce sujet - si quelqu'un pouvait me signaler un lien, je serais reconnaissant.

Répondre

4
<Window x:Class="ListDataBinding.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:m="clr-namespace:System.Windows.Media;assembly=PresentationCore" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <ObjectDataProvider x:Key="fontFamiliesKey" ObjectType="{x:Type m:Fonts}" MethodName="get_SystemFontFamilies"/> 
    </Window.Resources> 
    <Grid> 
     <ListBox ItemsSource="{Binding Source={StaticResource fontFamiliesKey}}"></ListBox> 

    </Grid> 
</Window> 

Essayez cette

+0

Comment avez-vous connu la méthode get_SystemFontFamilies? – Frinavale

+0

@Frinavale, il s'agit de la propriété SystemFontFamilies, les propriétés sont compilées en méthodes get_PropertyName dans un assembly –

0

Le problème est que votre source Binding est réglé sur {...} StaticResource. Il devrait être {x: Statique ...} à la place parce que SystemFontFamilies est une simple simple propriété CLR statique sur l'objet System.Windows.Media.Fonts, pas n'importe quel type de ressource. En fait, vous n'avez même pas besoin d'un Binding. Ceci est tout ce que vous avez besoin:

<ListBox ItemsSource="{x:Static m:Fonts.SystemFontFamilies}" /> 



Vous devriez vraiment arrêter de lire ici, mais vous peut être un peu sneakier si vous avez besoin des performances maximales. Avec la méthode ci-dessus - que vous devez absolument utiliser - vous remettez un ICollection<FontFamily> à WPF qui est en fait une instance ReadOnlyCollection<FontFamily>. Cela, à son tour, envelopper un tableau simple FontFamily[] contenant les éléments que vous voulez.

En raison de la couche d'emballage supplémentaire, WPFinternally won't detect la CollectionView optimale lors du remplissage de votre contrôle de l'interface utilisateur et devra revenir à ses techniques plus lentes itératives. Dans ce cas, cependant, l'encapsuleur expose par inadvertance le tableau brut à son support SyncRoot préhistorique, de sorte que vous pouvez en fait accéder au FontFamily[] directement à travers cette propriété si vous le souhaitez.

<ListBox ItemsSource="{Binding Source={x:Static m:Fonts.SystemFontFamilies}, 
           Path=(sc:ICollection.SyncRoot)}" /> 

En couple des choses à ce sujet. Notez que nous sommes de retour à l'utilisation d'un Binding puisque l'extension de balisage {x: Static} (StaticExtension) ne suivra pas un chemin de propriété au-delà de sa propriété statique. Notez également la distribution à ICollection, ce qui est requis ici (c'est-à-dire la façon dont WPF a froncé les sourcils à ce sujet en général). Pour prendre en charge la distribution, vous devez ajouter l'espace de noms System.Collections en haut de votre fichier XAML comme indiqué ci-dessous. Et finalement, avec cette astuce, vous perdrez également la possibilité de voir la liste des polices dans le concepteur XAML Visual Studio, mais tout fonctionne très bien lors de l'exécution.

... 
xmlns:sc="clr-namespace:System.Collections;assembly=mscorlib" 
... 
Questions connexes