2009-03-11 8 views
5

J'ai une application qui affiche les classements pour les ligues sportives. Ces tables sont essentiellement des grilles avec des colonnes différentes représentant des statistiques pour chaque équipe telles que les matchs joués, gagnés, perdus, buts marqués et concédés etc. Ainsi, un classement a une propriété intéressante: Pour une compétition donnée, nous avons toujours le même montant des rangées (représentant les équipes). Puisque les contrôles WPF sont sans apparence, je pourrais probablement utiliser un ListBox, un ListView, un ItemsControl directement, ou même un DataGrid. Cela ne devrait pas avoir autant d'importance.Redimensionnement de la police dans la liste ou la grille WPF pour utiliser correctement l'espace

Cependant, je veux quelque chose que je n'ai pas encore pu réaliser: Compte tenu de la taille de la table (en pratique, la taille de la fenêtre), TOUTES les équipes devraient être visibles à tout moment (pas de défilement vertical). Les colonnes de statistiques (telles que choisies par l'utilisateur) doivent être visibles et la taille de la police doit refléter cette taille afin qu'elle soit la plus grande possible sans que la colonne ne devienne trop grande pour que le contenu s'adapte.

Je peux facilement utiliser un UniformGrid pour atteindre la partie sans défilement vertical. Cependant, ajuster la taille de la police ne semble pas être aussi facile. Il y a bien sûr le ViewBox, qui permettrait au contenu de chaque cellule de se dimensionner individuellement pour être aussi grand que possible, mais cela pourrait conduire à la laideur, car vous finiriez avec un tas de cellules avec des tailles.

Je ne m'attends pas à avoir une réponse facile à cela, mais si c'est possible, j'aimerais beaucoup en entendre parler. En résumé:

  1. La table doit être redimensionnée avec la fenêtre tout en affichant toujours toutes les données sans barres de défilement.

  2. La taille de la police doit être définie sur la plus grande taille possible permettant à chaque colonne de chaque ligne d'afficher tout son contenu.

  3. Toutes les colonnes doivent être de la taille la plus petite possible afin que tout le contenu soit visible, à l'exception d'une colonne qui fait "* -size" pour manger l'espace restant.

Alors ... Des façons intelligentes de le faire? :)

Répondre

7

Cela fonctionnerait-il pour ce que vous avez besoin de faire de l'élément enfant de la fenêtre une ViewBox et de mettre tout le contenu à l'intérieur?Je ne sais pas si les détails de ce que vous faites causeront ce ne pas travailler, mais voici un exemple très simple de ce que je propose:

<Window x:Class="ZoomTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1"> 
    <Viewbox> 
     <StackPanel> 
      <TextBlock>2</TextBlock> 
      <TextBlock>Getting longer</TextBlock> 
      <TextBlock>Here is some really long text...</TextBlock> 
     </StackPanel> 
    </Viewbox> 
</Window> 

Tout le contenu est toujours visible, avec le taille de police maximale possible. Tout le texte s'échelonne uniformément.

+0

Exactement! +1 des lésions cérébrales pour moi, je pensais à des boîtes de vision à l'intérieur des cellules individuelles, mais c'est bien sûr totalement débile. Je dois juste avoir une emprise sur les propriétés Stretch et je devrais être libre à la maison - merci! –

1

Vous pouvez probablement faire quelque chose comme ça avec la taille de la police. Définissez le FontSize à une expression de liaison qui lie à la TextBox elle-même avec un IValueConverter personnalisé ({Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource FontSizeConverter}} ou quelque chose comme ça).

A l'intérieur du convertisseur, vous avez maintenant une référence au TextBox que vous pouvez utiliser pour obtenir le contenu du texte, la taille du contrôle, la taille d'un contrôle parent (la grille), etc. Vous pourriez être en mesure de utiliser cette information pour le calculer à la volée. Si vous avez besoin des boîtes de texte pour prendre cette décision en fonction l'une de l'autre, vous pouvez avoir un rappel statique au niveau de la page que vous appelez depuis la méthode Convert qui déterminera si vous êtes toujours en mode de redimensionnement et garder une trace de toute autre information (taille de police min ou max déjà calculée, etc). C'est un processus compliqué, mais il devrait y avoir plusieurs façons de le faire. Vous pouvez même d'abord masquer le texte dans toutes les zones, faire défiler toutes les zones de texte pour prendre ce type de décision (taille de police minimale), puis définir la taille de la police par programme et la masquer.

+0

Merci pour votre réponse - Je pense que je vois comment je pourrais le faire de cette façon, mais la réponse de Daniel Pratt l'a résolu sans le travail supplémentaire, alors j'ai donné la réponse acceptée à lui. Merci bien! –

Questions connexes