Domanda In WPF Allunga un controllo per riempire una colonna ListView


Come faccio a fare un controllo riempire l'intera cella in un ListView (con un GridView)? Ho giocato con varie proprietà, ma il controllo è sempre la sua dimensione minima.

Ecco il mio xaml.

<Window x:Class="ListViewUserControlTest.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:ListViewUserControlTest"
  Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <DataTemplate x:Key="UserControlCell">
            <Rectangle Fill="Red" HorizontalAlignment="Stretch" MinWidth="10" MinHeight="10" />              
        </DataTemplate>
    </Window.Resources>
    <Grid>        
        <ListView Name="MyListView">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="30" Header="Col1" DisplayMemberBinding="{Binding Name}"  />
                    <GridViewColumn Width="200" Header="Col2" CellTemplate="{StaticResource UserControlCell}"  />
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>

modificare Scusa se ho cambiato la domanda perché avevo eliminato il controllo utente come fonte del problema. Succede con qualsiasi controllo.


21
2018-01-29 20:46


origine


risposte:


Dopo aver ristretto la mia domanda stavo per Google e trovare un rispondi qui.

Fondamentalmente per qualche motivo i ListViewItem sono impostati per allineare a sinistra. Impostarli su Stretch risolve questo problema. Questo è fatto attraverso uno stile come questo:

<Style TargetType="ListViewItem">
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>

Questo sfortunatamente ha effetto su ogni colonna, ma poi puoi impostare il contenuto di altre colonne a sinistra, a destra, al centro come spiegato nel link.


56
2018-01-29 21:14



Un'altra soluzione quasi è di fare qualcosa come segue nel datatemplate che va nella gridviewcolumn

Width="{Binding  RelativeSource={RelativeSource Mode=FindAncestor , AncestorType=ListViewItem, AncestorLevel=1},Path=ActualWidth}">

Ciò si traduce in allungando la casella di testo alla larghezza della colonna, ma il bordo destro viene ritagliato e non renderizzato. Non ho ancora riparato quella parte. Quindi la risposta già accettata è probabilmente ancora la migliore.

Ecco un esempio di DataTemplate che fa questo.

<DataTemplate DataType="{x:Type local:EditableStringElement}"
          x:Key="cellSalutation">
<TextBox Text="{Binding _RecipientData._Salutation.Value , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         IsEnabled="{Binding _RecipientData._Salutation.IsEnabled}"
         Width="{Binding  RelativeSource={RelativeSource Mode=FindAncestor , AncestorType=ListViewItem, AncestorLevel=1},Path=ActualWidth}">
</TextBox>


4
2017-12-13 00:59



Il controllo utente specifica i valori per le proprietà "Altezza" e "Larghezza". Niente è consentito sovrascrivere le proprietà che hai impostato in modo esplicito. Rimuovi "Altezza" e "Larghezza" e il contenitore del controllo sarà in grado di modificare la dimensione.

Potresti voler impostare un ragionevole "MinHeight" e "MinWidth" per evitare che i contenitori ti schiacciano.

Diversi contenitori fanno cose diverse per le dimensioni del tuo controllo; ad esempio, Grid ti espande per riempire la cella della griglia in cui ti trovi, mentre StackPanel ti riduce alle dimensioni minime. Quindi potresti aver bisogno di occuparti anche di questo.


3
2018-01-29 20:57