2010-09-15 15 views
15

Ho un problema frustrante di cui apprezzerei molto l'aiuto. Ho una ListView all'interno di un ViewBox e non riesco a ottenere gli elementi all'interno di ListView per allungare orizzontalmente.Estensione degli elementi in un ViewView WPF all'interno di un ViewBox

Ecco la XAML:

<Window x:Class="WpfApplication3.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication3" 
     Title="Window1"> 
    <Window.Resources> 
     <local:Inning x:Key="inning"> 
      <local:Inning.Skins> 
       <local:Skin SkinNumber="1"></local:Skin> 
       <local:Skin SkinNumber="2"></local:Skin> 
       <local:Skin SkinNumber="3"></local:Skin> 
      </local:Inning.Skins> 
     </local:Inning> 
    </Window.Resources> 
    <Grid DataContext="{StaticResource inning}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
     </Grid.RowDefinitions> 
     <TextBlock Background="Black" 
        Text="SKINS" 
        Foreground="White" 
        FontSize="80" 
        FontWeight="Bold" 
        HorizontalAlignment="Center"></TextBlock> 
     <Grid Margin="2" 
       Grid.Row="1"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="auto"></ColumnDefinition> 
       <ColumnDefinition Width="*"></ColumnDefinition> 
       <ColumnDefinition Width="*"></ColumnDefinition> 
      </Grid.ColumnDefinitions> 
      <Viewbox> 
       <ListView Name="lvSkinNumbers" 
          ItemsSource="{Binding Skins}" 
          HorizontalAlignment="Stretch" 
          Background="Black" 
          VerticalAlignment="Stretch" 
          VerticalContentAlignment="Stretch"> 
        <ListView.ItemTemplate> 
         <DataTemplate> 
          <TextBlock FontSize="250" 
             VerticalAlignment="Stretch" 
             LineStackingStrategy="BlockLineHeight" 
             Margin="2" 
             TextAlignment="Center" 
             HorizontalAlignment="Stretch" 
             Background="Black" 
             Foreground="White" 
             Text="{Binding SkinNumber}"></TextBlock> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </Viewbox> 
      <Viewbox Grid.Column="1"> 
       <ListView Name="lvFirstInningSkins" 
          ItemsSource="{Binding Skins}" 
          Grid.Column="1" 
          HorizontalContentAlignment="Stretch" 
          Background="Black"> 
        <ListView.ItemTemplate> 
         <DataTemplate> 
          <TextBlock FontSize="250" 
             VerticalAlignment="Stretch" 
             LineStackingStrategy="BlockLineHeight" 
             Margin="2" 
             TextAlignment="Center" 
             HorizontalAlignment="Stretch" 
             Background="Green" 
             Foreground="White" 
             Text="{Binding SkinNumber}"></TextBlock> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </Viewbox> 
      <Viewbox Grid.Column="2" 
        HorizontalAlignment="Stretch"> 
       <ListView Name="lvSecondInningSkins" 
          ItemsSource="{Binding Skins}" 
          Grid.Column="2" 
          HorizontalAlignment="Stretch" 
          Background="Black"> 
        <ListView.ItemTemplate> 
         <DataTemplate> 
          <TextBlock FontSize="250" 
             VerticalAlignment="Stretch" 
             LineStackingStrategy="BlockLineHeight" 
             Margin="2" 
             TextAlignment="Center" 
             HorizontalAlignment="Stretch" 
             Background="Green" 
             Foreground="White" 
             Text="{Binding SkinNumber}"></TextBlock> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </Viewbox> 
     </Grid> 
    </Grid> 
</Window> 

Ecco il codice dietro con le definizioni della pelle e di inning oggetti:

using System; 
using System.Windows; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 

namespace WpfApplication3 
{ 

public class Inning 
{ 
    private ObservableCollection<Skin> _skins = new ObservableCollection<Skin>(); 
    public ObservableCollection<Skin> Skins 
    { 
    get { return _skins; } 
    set { _skins = value; } 
    } 
} 

public class Skin : INotifyPropertyChanged 
{ 
    public Skin() 
    { 
    } 

    public Skin(int skinNumber, Inning inning) 
    { 
    this.SkinNumber = skinNumber; 
    this.Inning = inning; 
    } 

    public Inning Inning { get; set; } 
    public int SkinNumber { get; set; } 

    public int SkinCount 
    { 
    get { return this.Inning.Skins.Count; } 
    } 

    public void Notify(string propertyName) 
    { 
    if (PropertyChanged != null) 
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

} 


public partial class Window1 : Window 
{ 

    public Window1() 
    { 
    InitializeComponent(); 
    } 


} 
} 

Il numero di pelli che può verificarsi in un inning può cambiare e può essere modificato dall'utente, quindi ho inserito ListView in ViewBox in modo che vengano automaticamente ridimensionati di conseguenza quando cambia il numero di skin. La finestra risultante può essere visto qui: http://i52.tinypic.com/244wqpl.jpg

Ho provato tutti i tipi di combinazioni di HorzontalAlignment="Stretch" e HorizontalContentAlignment="Stretch" e ha cercato modificando il modello ItemsPanel ma non posso per la vita di me sembrano di capire come ottenere il ListView per allungare orizzontalmente. È quello che sto cercando di fare impossibile senza qualche codice dietro per modificare la larghezza del ListView in modo dinamico? O mi sto perdendo qualcosa di veramente semplice?

Qualsiasi aiuto che chiunque può offrire sarebbe più apprezzato.

Grazie,

Matthew

risposta

50

Provare a impostare l'ItemContainerStyle per il vostro ListView a qualcosa di simile:

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

Potrebbe anche essere necessario impostare <Viewbox Stretch="Fill"/>.

Dopo questo, penso che sia possibile rimuovere tutti gli altri setter "HorizontalAlignment = Stretch" e "HorizontalContentAlignment = Stretch" nel codice in quanto probabilmente non sarà più necessario.

+1

'Stretch = "Fill"' !! Grazie mille per questo. Con la viewbox allungata e il ListViewItem.HorizontalContentAlignment impostato su Stretch, era vicino. Ha dato questo: http://i55.tinypic.com/28cdmwh.jpg - close, ma il testo è allungato invece del solo TextBlock che viene allungato. Se imposto anche la larghezza di ListViews su ActualWidth del ViewBox tramite questo codice: 'Width =" {Binding RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Tipo Viewbox}}, Path = ActualWidth} "", ottengo esattamente quello che sto dopo. Questo: http://i54.tinypic.com/2mo8qk5.jpg Grazie mille per il vostro aiuto. – MajorRefactoring

+0

Grazie per quello. Questo ha funzionato anche per me in una lista. – MikeKulls

+1

Non ha funzionato per me in un'app di Windows Store. Provoca una trasformazione in scala dell'oggetto, dei caratteri, dell'altezza e della larghezza. La risposta originale, tuttavia, ha funzionato come previsto. –

5

Inaspettatamente impostazione ScrollViewer.HorizontalScrollBarVisibility="Disabled" lavorato anche per me:

<ListView ItemsSource="{Binding SourceList}" 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
Problemi correlati