7
votes

WPF Treeview Article Fond sur une rangée entière

J'écris une application et j'ai besoin de définir des antécédents sous la ligne entière par des éléments. J'ai trouvé une certaine inspiration dans ici mais je ne peux pas avoir une idée de la frontière Valeur de l'arrière-plan dans le modèle (le problème est un peu plus compliqué :)

Mon problème est que dans l'arborescence, il existe 2 types de "données" (fichiers et dossiers). L'utilisateur peut modifier l'arrière-plan sous les fichiers et les dossiers. P>

À l'heure actuelle, j'ai l'arrière-plan sur textblock, mais cela semble horrible et je veux avoir l'arrière-plan sur toute la ligne (je pense que cela ressemblera beaucoup mieux). P>

Donc:
img1 p>

mais ce dont j'ai besoin est:
img2 p>

Si je change la valeur de l'arrière-plan bord, je change tous les éléments (logiquement ). Donc, je suppose que j'ai vraiment besoin de travailler avec l'arrière-plan TextBlock, mais je ne peux pas atteindre la propagation de la rangée entière (stretch n'est pas une solution, car elle l'étendit juste à la fin de la ligne, mais pas cet espace blanc avant). P >

Merci pour des conseils. P>

EDIT: strong> xaml ici: P>

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:treeView">
<!-- TREEVIEW  -->
    <Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
        <Setter Property="Focusable" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Grid
          Width="15"
          Height="13"
          Background="Transparent">
                        <!--<Path x:Name="ExpandPath"
            HorizontalAlignment="Left" 
            VerticalAlignment="Center" 
            Margin="1,1,1,1"
            Fill="Red"
            Data="M 4 0 L 8 4 L 4 8 Z"/>-->
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked"
               Value="True">
                            <!--<Setter Property="Data"
                TargetName="ExpandPath"
                Value="M 0 4 L 8 4 L 4 8 Z"/>-->
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="TreeViewItemFocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border>
                        <Rectangle Margin="0,0,0,0"
                 StrokeThickness="5"
                 Stroke="Black"
                 StrokeDashArray="1 2"
                 Opacity="0"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    <Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="Padding" Value="1,0,0,0"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="FocusVisualStyle" Value="{StaticResource TreeViewItemFocusVisual}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TreeViewItem}">
                    <ControlTemplate.Resources>
                        <local:LeftMarginMultiplierConverter Length="19" x:Key="lengthConverter" />
                    </ControlTemplate.Resources>
                    <StackPanel>
                        <Border x:Name="Bd"
                          Background="{TemplateBinding Background}"
                          BorderBrush="{TemplateBinding BorderBrush}"
                          BorderThickness="{TemplateBinding BorderThickness}"
                          Padding="{TemplateBinding Padding}">
                            <Grid Margin="{Binding Converter={StaticResource lengthConverter}, RelativeSource={RelativeSource TemplatedParent}}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="19" />
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                <ToggleButton Grid.Column="1" x:Name="Expander"
                                  Style="{StaticResource ExpandCollapseToggleStyle}"
                                  IsChecked="{Binding Path=IsExpanded,
                                              RelativeSource={RelativeSource TemplatedParent}}"
                                  ClickMode="Press"/>
                                <ContentPresenter x:Name="PART_Header" Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ContentSource="Header" />
                            </Grid>
                        </Border>
                        <ItemsPresenter x:Name="ItemsHost" />
                    </StackPanel>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsExpanded" Value="false">
                            <Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed"/>
                        </Trigger>
                        <Trigger Property="HasItems" Value="false">
                            <Setter TargetName="Expander" Property="Visibility" Value="Hidden"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="HasHeader" Value="false"/>
                                <Condition Property="Width" Value="Auto"/>
                            </MultiTrigger.Conditions>
                            <Setter TargetName="PART_Header" Property="MinWidth" Value="75"/>
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="HasHeader" Value="false"/>
                                <Condition Property="Height" Value="Auto"/>
                            </MultiTrigger.Conditions>
                            <Setter TargetName="PART_Header" Property="MinHeight" Value="19"/>
                        </MultiTrigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>


1 commentaires

Pouvez-vous écrire votre code XAML?


3 Réponses :


-4
votes

Utilisez Snoop pour comprendre l'arborescence visuelle que vous essayez de modifier. De cette façon, il faudra 2-3 minutes pour connaître ce que vous devez modifier. (Google)

Mon pari est que vous devez utiliser quelque chose comme ceci: P>

<TreeView>
<TreeView.ItemContainerStyle>
<Style BasedOn="{StaticResource {x:Type TreeViewItem}}" TargetType="TreeViewItem">
                    <Setter Property="Background" Value="Purple" />
</TreeView.ItemContainerStyle>
</TreeView>


5 commentaires

Cela semble être une réponse..oule moi vérifier plus de détails..Je marquera comme une réponse je suppose bientôt..thx!


Cela m'a déplacé un peu, mais le problème est que lorsque je mets l'élémentContainterstyle dans le code, juste des premiers articles sont "violet" ..


@PIGGY Je ne suis pas sûr que cela va travailler ou non. Pouvez-vous lier la valeur d'arrière-plan à votre modèle de vue? Je n'ai pas essayé cela, alors je ne suis pas sûr que cela fonctionnera ou non.


@Faisal arrière-plan je peux lier. Dans le XAML, c'est le premier setter dans TreeViewItem. Mais cela lie tous les articles et subitems. L'élémentContainer semble que cela fonctionnera, mais le problème est qu'il définit le fond juste sur le niveau supérieur des articles: D Aaaa Je déteste Templation ..: / ^^


ehm ok, je suis vraiment stupide ..: / .. avec ce modèle, cela fonctionne simplement définir le fond de l'arbreViewItem ..: / (avant 2hours, j'ai eu un autre modèle, où était quelque chose de "faux" et que le changement de fond n'a pas fonctionné à tout..J'ai réécrit le modèle de Treeview et ça marche maintenant ..: / ..) .. OK, donnez-moi moins, mon gros mauvais ^^, mais le snoop m'a aidé beaucoup. la fin..



10
votes

Merci pour votre solution! Voici un aperçu de ce que j'ai fait jusqu'à présent:

Aperçu P>

<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
    <Setter Property="Focusable" Value="False"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <Grid
                Width="15"
                Height="13"
                Background="Transparent">
                    <Path 
                    x:Name="ExpandPath"
                    HorizontalAlignment="Left" 
                    VerticalAlignment="Center" 
                    Margin="1,1,1,1"
                    Fill="{StaticResource GlyphBrush}"
                    Data="M 4 0 L 8 4 L 4 8 Z"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Data" TargetName="ExpandPath" Value="M 0 4 L 8 4 L 4 8 Z"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


3 commentaires

Cool!!! Je trouvais cette solution, mais est incomplet, convertisseur et le code de style toogle ne sont pas présents, mais merci.


J'ai ajouté le gauchemarginmultiplierconverter et expandcollapsetogglestyle dans mon message.


M'a sauvé une tonne de temps! Merci!



0
votes

Compléter la solution de Dominic Jonas, en utilisant la méthode getchildoftype de Comment obtenir des enfants d'un conteneur WPF par type? : xxx

et mettre en surbrillance la souris sur une seule ligne unique: Comment faire la gâchette WPF pour ismouseover sur TreeViewItM n'affecte pas tous les parents de la souris sur le contrôle?


0 commentaires