Comment puis-je obtenir une colonne ListView GridViewColumn pour remplir l'espace restant dans ma grille?

je veux créer une ListView qui a deux colonnes de largeur fixe et une troisième colonne à remplir l'espace restant. Donc quelque chose comme ceci:

<ListView>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" Width="*" />
            <GridViewColumn Header="Age" Width="50" />
            <GridViewColumn Header="Gender" Width="50" />
        </GridView>
    </ListView.View>
</ListView>

le problème est que je ne trouve pas le moyen d'obtenir le Name colonne pour remplir l'espace restant, en définissant la largeur à * ne fonctionne pas. Il semble qu'il y est un moyen de faire cela avec un convertisseur de valeurs, mais il semble qu'il devrait y avoir un moyen plus simple. Comme avec un contrôle DataGrid, vous pouvez spécifier les largeurs de colonnes *.

23
demandé sur JChristian 0000-00-00 00:00:00

4 réponses

le problème est que la largeur d'une colonne GridViewColumn est double, plutôt qu'un objet GridLength, et il n'y a pas de conversion en place pour gérer le *. Je ne sais pas s'il s'agit d'un oubli de l'équipe du FPF ou non. On pourrait penser qu'il devraient être pris en charge.

mis à part le convertisseur, le seul autre moyen que j'ai vu est ici:http://www.ontheblog.net/CMS/Default.aspx?tabid=36&EntryID=37.

les deux sont des travaux supplémentaires qui ne devraient pas être requis. J'ai trouvé d'autres choses "bizarres" avec le combo ListView et GridView donc j'ai arrêté de les utiliser. Si j'ai besoin d'un datagrid, j'utilise le tiers sous licence, si j'ai besoin d'un menu de style ListBox complexe, j'utilise juste une liste de type Templier.

7
répondu Josh 2011-11-30 20:11:45

j'ai essayé de réaliser la même chose mais j'ai ensuite décidé que je voudrais que mes colonnes ListView consomment un pourcentage de ListView à la place, le résultat de ceci est que toutes les colonnes consomment une partie de l'espace et tout l'espace étant consommé dans ListView. Vous pouvez configurer cela pour avoir n'importe quel pourcentage que vous aimez sur la dernière colonne pour atteindre directement votre 'remplir l'espace restant sur la dernière colonne' objectif.

je trouve cette méthode assez robuste et fiable (même sur les redimensionner!) donc pensé que je peut partager.

j'ai quatre colonnes dans mon ListView pour cet exemple. Tout ce dont vous avez besoin est d'enregistrer le SizeChanged événement dans votre ListView avec le ci-dessous gestionnaire d'événement:

private void ProductsListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
    ListView listView = sender as ListView;
    GridView gView = listView.View as GridView;

    var workingWidth = listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar
    var col1 = 0.50;
    var col2 = 0.20;
    var col3 = 0.15;
    var col4 = 0.15;

    gView.Columns[0].Width = workingWidth*col1;
    gView.Columns[1].Width = workingWidth*col2;
    gView.Columns[2].Width = workingWidth*col3;
    gView.Columns[3].Width = workingWidth*col4;
}
34
répondu GONeale 2017-12-01 09:35:35

est tombé sur ceci en regardant dans un problème similaire, mon problème était que je voulais que toutes les colonnes soient "Auto" s'attendre à la première, ce qui remplirait juste l'espace supplémentaire, donc j'ai étendu sur la solution de GONeale.

private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
    ListView _ListView = sender as ListView;
    GridView _GridView = _ListView.View as GridView;
    var _ActualWidth = _ListView.ActualWidth - SystemParameters.VerticalScrollBarWidth;
    for (Int32 i = 1; i < _GridView.Columns.Count; i++)
    {
        _ActualWidth = _ActualWidth - _GridView.Columns[i].ActualWidth;
    }
    _GridView.Columns[0].Width = _ActualWidth;
}

alors le XAML est tout simplement:

...
<ListView.View>
    <GridView>
        <GridViewColumn Header="Title" />
        <GridViewColumn Header="Artist" Width="Auto" />
        <GridViewColumn Header="Album" Width="Auto" />
        <GridViewColumn Header="Genre" Width="Auto" />
    </GridView>
</ListView.View>
...

ce code pourrait aussi être utilisé de façon plus générale car le nombre de colonnes n'est pas codé de manière rigide et avec un peu de retouche vous pourriez probablement rendre la 'colonne de remplissage' définissable à travers une sorte de logique.

j'Espère que ça aide quelqu'un :)

14
répondu Gary Connell 2013-02-03 16:55:10

Mon besoin était d'avoir toutes les colonnes avec la même largeur. Les solutions ci-dessus sont très bien, mais je préfère envelopper une telle chose dans une propriété attachée (MVVM, réutilisabilité, etc.). Voici mon code, si ça peut aider.

    public class StarSizeHelper {

    private static readonly List
1
répondu