2010-09-15 15 views
15

Tengo un problema frustrante que agradecería algo de ayuda. Tengo un ListView dentro de un ViewBox y no puedo hacer que los elementos dentro del ListView se extiendan horizontalmente.Estirar los elementos en un WPF ListView dentro de un ViewBox

Aquí es el 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> 

Aquí está el código detrás con las definiciones de la piel y Inning objetos:

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(); 
    } 


} 
} 

El número de pieles que puede ocurrir en una entrada puede cambiar, y el usuario puede cambiarlo, así que puse ListViews en ViewBoxes para que cambien de tamaño automáticamente cuando cambie el número de máscaras. La ventana que se puede ver aquí: http://i52.tinypic.com/244wqpl.jpg

He intentado todo tipo de combinaciones de HorzontalAlignment="Stretch" y HorizontalContentAlignment="Stretch" y trató de modificar la plantilla ItemsPanel pero no puedo por la vida de mí parecer imaginar cómo conseguir el ListView estirar horizontalmente ¿Es lo que estoy tratando de hacer imposible sin algún código para alterar el ancho de ListView dinámicamente? ¿O me estoy perdiendo algo realmente simple?

Cualquier ayuda que cualquiera pueda ofrecer sería muy apreciada.

Gracias,

Mateo

Respuesta

50

Intente configurar la ItemContainerStyle para su ListView a algo como:

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

También podría ser necesario para establecer <Viewbox Stretch="Fill"/>.

Después de esto, creo que puede eliminar todos los otros parámetros "HorizontalAlignment = Stretch" y "HorizontalContentAlignment = Stretch" en su código, ya que probablemente ya no sea necesario.

+1

'Stretch = "Fill"' !! Muchas gracias por eso. Con viewbox estirado y ListViewItem.HorizontalContentAlignment establecido en Stretch, estaba cerca. Dio esto: http://i55.tinypic.com/28cdmwh.jpg - cerca, pero el texto se estira en lugar de solo estirar el TextBlock. Si también configuro el ancho de ListViews en el Ancho real del ViewBox mediante este código: 'Width =" {Binding RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Type Viewbox}}, Path = ActualWidth} "', obtengo exactamente lo que estoy buscando. Esto: http://i54.tinypic.com/2mo8qk5.jpg Muchas gracias por su ayuda. – MajorRefactoring

+0

Gracias por eso. Esto funcionó para mí también en un cuadro de lista. – MikeKulls

+1

No funcionó para mí en una aplicación de Windows Store. Provoca una transformación de escala del objeto, las fuentes, la altura y el ancho. La respuesta original, sin embargo, funcionó como se esperaba. –

5

Inesperadamente establecer ScrollViewer.HorizontalScrollBarVisibility="Disabled" también trabajó para mí:

<ListView ItemsSource="{Binding SourceList}" 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
Cuestiones relacionadas