2010-09-15 13 views
15

Ich habe ein frustrierendes Problem, dass ich etwas Hilfe mit schätzen würde. Ich habe eine ListView innerhalb einer ViewBox und ich kann die Elemente innerhalb der ListView nicht horizontal strecken. HierStretching der Elemente in einer WPF-ListView innerhalb einer ViewBox

ist die 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> 

Hier ist der Code hinter den Definitionen der Haut und Inning Objekte:

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


} 
} 

Die Anzahl der Häute, die in einem Inning auftreten kann kann geändert werden und kann vom Benutzer geändert werden, also habe ich die ListViews in ViewBoxes gesetzt, also ändern sie automatisch die Größe entsprechend, wenn die Zahl der Häute sich ändert. Das resultierende Fenster kann hier gesehen werden: http://i52.tinypic.com/244wqpl.jpg

ich alle möglichen Kombinationen von HorzontalAlignment="Stretch" versucht habe und HorizontalContentAlignment="Stretch" und versuchte, die Itemspanel-Vorlage zu modifizieren, aber ich kann für das Leben von mir nicht scheinen, um herauszufinden, wie das Listview bekommen horizontal ausdehnen. Ist das, was ich versuche, unmöglich ohne einen Code, um die Breite des ListView dynamisch zu ändern? Oder fehlt mir etwas wirklich Einfaches?

Jede Hilfe, die jemand anbieten kann, würde am meisten geschätzt werden.

Danke,

Matthew

Antwort

50

Versuchen Sie, die ItemContainerStyle für Ihre Listview etwas wie Einstellung:

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

auch Sie müssen möglicherweise <Viewbox Stretch="Fill"/> einzustellen.

Danach denke ich, dass Sie alle anderen "HorizontalAlignment = Stretch" und "HorizontalContentAlignment = Stretch" Setter in Ihrem Code entfernen können, da es wahrscheinlich nicht mehr notwendig sein wird.

+1

'Stretch = "Fill"' !! Vielen Dank dafür. Wenn die Viewbox gestreckt und ListViewItem.HorizontalContentAlignment auf Stretch festgelegt wurde, war sie geschlossen. Es gab folgendes: http://i55.tinypic.com/28cdmwh.jpg - schließen, aber der Text wird gestreckt statt nur der TextBlock gestreckt wird. Wenn ich auch die Breite der ListViews über diesen Code auf die ActualWidth der ViewBox setze: 'Width =" {Binding RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Type Viewbox}}, Pfad = ActualWidth} ", bekomme ich genau das, wonach ich bin. This: http://i54.tinypic.com/2mo8qk5.jpg Vielen Dank für Ihre Hilfe. – MajorRefactoring

+0

Danke dafür. Das hat bei mir auch in einer Listbox funktioniert. – MikeKulls

+1

Funktionierte in einer Windows Store App nicht für mich. Es verursacht eine Skalierung des Objekts, Schriftarten, Höhe und Breite. Die ursprüngliche Antwort funktionierte jedoch wie erwartet. –

5

unerwartet ScrollViewer.HorizontalScrollBarVisibility="Disabled" Einstellung arbeitete auch für mich:

<ListView ItemsSource="{Binding SourceList}" 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
Verwandte Themen