8
votes

WPF GridView Header ne défile pas horizontalement

J'ai une grille de grille avec une notification de défilement qui utilisait horizontalement avec le contenu de la grille. Je l'ai changé en utilisant Solution des coins arrondis de Chris Cavanagh , qui inclut la mise en place d'une grille autour du gridviewheaderrowpresenter et d'ajouter une bordure au même niveau utilisé comme masque d'opacité ( Voir cette question pour plus d'informations ).

Ceci semble désactiver le défilement horizontal pour l'en-tête. Si je redimensionniste la fenêtre du navigateur sur quelque chose de plus petit forçant une barre de défilement pour le contenu, l'en-tête reste corrigé. J'imagine que le XAML ajouté en quelque sorte désactive le défilement pour l'en-tête. P>

C'est ce que le code ressemble actuellement. Veuillez noter que cela se trouve dans une définition de style qui cible un élément ScrollViewer, non directement dans le marquage XAML de la page. P>

<ScrollViewer Focusable="false"
              HorizontalScrollBarVisibility="Hidden"
              VerticalScrollBarVisibility="Hidden"
              DockPanel.Dock="Top"
              Style="{DynamicResource HEK_ScrollViewer}">
    <Grid>
        <Border Name="Mask"
                CornerRadius="20,20,0,0"
                Background="White" />
        <GridViewHeaderRowPresenter Margin="1,0,1,1"
                                    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                    Columns="{Binding TemplatedParent.View.Columns, RelativeSource={RelativeSource TemplatedParent}}"
                                    AllowsColumnReorder="{Binding TemplatedParent.View.AllowsColumnReorder, RelativeSource={RelativeSource TemplatedParent}}"
                                    ColumnHeaderContainerStyle="{DynamicResource HEK-GridViewColumnHeaderStyle}"
                                    ColumnHeaderContextMenu="{Binding TemplatedParent.View.ColumnHeaderContextMenu, RelativeSource={RelativeSource TemplatedParent}}"
                                    ColumnHeaderStringFormat="{Binding TemplatedParent.View.ColumnHeaderStringFormat, RelativeSource={RelativeSource TemplatedParent}}"
                                    ColumnHeaderTemplate="{Binding TemplatedParent.View.ColumnHeaderTemplate, RelativeSource={RelativeSource TemplatedParent}}"
                                    ColumnHeaderTemplateSelector="{Binding TemplatedParent.View.ColumnHeaderTemplateSelector, RelativeSource={RelativeSource TemplatedParent}}"
                                    ColumnHeaderToolTip="{Binding TemplatedParent.View.ColumnHeaderToolTip, RelativeSource={RelativeSource TemplatedParent}}">
            <GridViewHeaderRowPresenter.OpacityMask>
                <VisualBrush Visual="{Binding ElementName=Mask}" />
            </GridViewHeaderRowPresenter.OpacityMask>
        </GridViewHeaderRowPresenter>
    </Grid>
</ScrollViewer>


0 commentaires

3 Réponses :


1
votes

Je ne suis pas vraiment sûr de ce qui cause ce comportement. Je suppose qu'il y a un code de code dans la liste qui attend un gridviewheaderrowpresenter en tant qu'enfant direct de l'en-tête ScrollViewer.

Mais si vous passez la grille comme parent dans la vision de ScrollViewer, il défile correctement. P>

<DockPanel Margin="{TemplateBinding Padding}">
    <Grid DockPanel.Dock="Top">
        <Border Name="Mask" CornerRadius="4,4,0,0" Background="White" />
        <ScrollViewer  Focusable="False" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
            <GridViewHeaderRowPresenter  AllowsColumnReorder="{Binding TemplatedParent.View.AllowsColumnReorder, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderContainerStyle="{Binding TemplatedParent.View.ColumnHeaderContainerStyle, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderToolTip="{Binding TemplatedParent.View.ColumnHeaderToolTip, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderContextMenu="{Binding TemplatedParent.View.ColumnHeaderContextMenu, RelativeSource={RelativeSource TemplatedParent}}" ColumnHeaderTemplate="{Binding TemplatedParent.View.ColumnHeaderTemplate, RelativeSource={RelativeSource TemplatedParent}}" Columns="{Binding TemplatedParent.View.Columns, RelativeSource={RelativeSource TemplatedParent}}" Margin="2,0" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
                <GridViewHeaderRowPresenter.OpacityMask>
                    <VisualBrush Visual="{Binding ElementName=Mask}" />
                </GridViewHeaderRowPresenter.OpacityMask>
            </GridViewHeaderRowPresenter>
        </ScrollViewer>
    </Grid>
    <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="False" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" KeyboardNavigation.DirectionalNavigation="Local" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</DockPanel>


0 commentaires

0
votes

Bien qu'un ancien poste, mais si quelqu'un a le même problème. C'est un peu similaire à Solution Tedy Pranolo ci-dessus. J'ai eu ce problème sur lequel l'en-tête de la grille ne ferait pas défiler avec le contenu. Ajout d'une vision de ScrollViewer Juste pour GridViewheaderrowPresenter dans la commande ControlTemplate for ScrollViewer (pour listeView) résolue le problème pour moi. Ceci est la partie de xaml qui a le problème fixé: xxx

ceci est le xaml lorsque le problème était là: xxx

Notez la vision de ScrollViewer manquante englobant GridViewheadRowPresenter.

J'espère que cela aide!


0 commentaires

1
votes

GridViewHeaderRrowPresenter a besoin de ScrollViewer en tant que parent, c'est du code carré. Vous pouvez modifier son modèle

exemple: xxx


0 commentaires