10
votes

Ne pas montrer des éléments avec visibilité = effondré dans Windows 8.1 GridView

J'ai une application Windows 8.1 avec un GridView lié ​​à une collection observable sur mesure (triable, dédupliquée). Dans cette collection, je fais un filtrage et un drapeau ishacident pour chaque article.

Dans le gabarit de données de l'élément, il est affiché que l'élément s'effondre si un drapeau ishaden est défini sur true. xxx

Cette approche fonctionne dans Windows Phone 8.1 xaml , Faire disparaître les éléments du listview mais il ne fonctionne pas dans Windows 8.1 GridView . Le problème avec Windows 8.1 est que lorsque je définirai un élément de la collection à masqué, ID disparaît à partir du GridView mais laisse un endroit vide, il y a donc un espace dans le gridview .

Entrez la description de l'image ici

Des idées sur la façon dont pour le résoudre? Peut-être même édition de style xaml?

Voici une solution minimale pour reproduire le problème: https://dl.dropboxusercontent.com/u/73642/gv.zip

J'ai essayé la largeur de liaison et la hauteur des éléments à l'indicateur caché et le réglage à 0 lorsque le L'article est caché, mais il n'a pas aidé, toujours une lacune dans le GridView .

update : une solution de contournement filtrerait la collecte liée réelle, Mais cela n'est pas possible, à cause de certaines exigences de l'entreprise.


3 commentaires

Êtes-vous sûr que c'est visibilité.collapted ? Parce qu'il ressemble à visibilité.Choride (et connaissez-vous sûrement différence ).


Oui, j'en suis sûr, il n'y a pas de visibilité.Chiché à Winrt


Qu'est-ce que vous utilisez comme votre gridview.itemspanel?


3 Réponses :


0
votes

J'ai essayé votre exemple de solution et j'ai changé à une liste de réception. Il présente le même comportement lorsque la grille elle-même est cachée. Je n'ai pas de xaml espion à vérifier, mais il semble que tout contrôle basé sur la liste alloua un élément rendu pour chaque élément de la liste.

J'ai changé votre poignée de clic sur ds.removeat (5); au lieu de cacher l'élément et que l'élément est retiré de la vue avec une belle animation. Cela semble être comme prévu et une recherche intéressante.


0 commentaires

0
votes

Cela me prend beaucoup de temps pour comprendre le problème et la solution juste devant mes yeux. Vous essayez de cacher l'élément lui-même mais le conteneur toujours là, lorsque vous ajoutez un élément à une grille à grille, l'élément est enveloppé dans un conteneur d'élément. De MSDN:

"Lorsque vous ajoutez un élément à un articleControl, l'élément est enveloppé dans un Conteneur d'article. Par exemple, un élément ajouté à une liste de réception est enveloppé dans un listViewItem. Sans virtualisation de l'UI, l'ensemble du jeu de données est conservé en mémoire et un conteneur d'élément est également créé pour chaque élément de la base de données. Une liste de réception qui est liée à une collection de 1000 articles Créez également 1000 conteneurs ListViewemItem stockés en mémoire. "

Vous devez désactiver le conteneur et créer deux dataTemplate et utiliser DataMplateselector Vous pouvez choisir quel type de données pour désactiver et activer les éléments. Vérifiez cet article utile .


0 commentaires

5
votes

Le problème est dans le GridView code> 'S ElémentsPanel code>.

Les deux itemswrapgrid code> et wallgrid code> sont uniformes grilles. Tous leurs éléments enfants partageront la même hauteur et la même largeur. C'est pourquoi même si vous effondrez le itemTemplate code>, l'espace est toujours réservé. P>

Ce que vous avez vraiment besoin ici est un wrappanel code>. WinRT n'a pas d'intégré wrappanel code> mais Jerry Nixon en a construit un et vous pouvez l'attraper à partir de Ici . p>

Après avoir mis à jour votre GridView code> S Emnumpanel code>, vous avez toujours une dernière chose à faire. Vous devez également obtenir le gridvievem code> qui héberge votre itemTemplate définit son visibilité code> sur effondré code>. P>.

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        ds[5].IsHidden = true;
  
        await Task.Delay(1000);
        var gridViewItem =(GridViewItem)this.gv.ContainerFromIndex(5);
        gridViewItem.Visibility = Visibility.Collapsed;
    }


2 commentaires

Merci de me donner du crédit pour le wrappanel . Vous avez fait un bon travail d'expliquer le problème. Il me semble que le retirer de la Observablecollection lui aurait donné tout ce qu'il voulait sans toutes les gymnases codantes; Mais, j'ai vu son commentaire à ce sujet.


Vous méritez le crédit @ Jerrynixon-MSFT, sinon je ne pourrais même pas y répondre! :)