2010-09-15 15 views
15

Mam frustrujący problem, który byłby bardzo wdzięczny za pomoc. Mam ListView w ViewBox i nie mogę uzyskać pozycji w ListView, aby rozciągnąć poziomo.Rozciąganie elementów w liście WPF ViewView w ViewBox

Oto 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> 

Oto kod związany z definicjami obiektów skóry i Inning:

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


} 
} 

liczba skórek, które mogą występować w rundzie może się zmienić i może zostać zmieniony przez użytkownika, więc umieściłem ListViews w ViewBoxes, aby automatycznie zmieniły rozmiar, gdy zmieni się liczba skórek. Powstały okno można zobaczyć tutaj: http://i52.tinypic.com/244wqpl.jpg

Próbowałem wszelkiego rodzaju kombinacje HorzontalAlignment="Stretch" i HorizontalContentAlignment="Stretch" i próbował modyfikację szablonu ItemsPanel ale nie mogę dla życia mnie wydaje się, aby dowiedzieć się, jak uzyskać ListView rozciągnąć się poziomo. Czy to, co próbuję zrobić niemożliwe, bez jakiegoś kodu, aby dynamicznie zmieniać szerokość listy? Czy może brakuje mi czegoś naprawdę prostego?

Każda pomoc, którą każdy może zaoferować, byłaby najbardziej doceniana.

Dzięki,

Matthew

Odpowiedz

50

Spróbuj ustawić ItemContainerStyle dla ListView do czegoś jak:

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

też może trzeba ustawić <Viewbox Stretch="Fill"/>.

Po tym, myślę, że możesz usunąć wszystkie inne ustawienia "HorizontalAlignment = Stretch" i "HorizontalContentAlignment = Stretch", ponieważ prawdopodobnie nie będzie to już konieczne.

+1

'Stretch = "Fill"' !! Bardzo ci za to dziękuję. Po rozłożeniu widoku i ustawieniu ListViewItem.HorizontalContentAlignment na Stretch było blisko. Dało to: http://i55.tinypic.com/28cdmwh.jpg - close, ale tekst jest rozciągnięty zamiast tylko rozciągniętego paska TextBlock. Jeśli również ustawić szerokość ListViews do ActualWidth z ViewBox za pomocą tego kodu: 'Width =" {Binding RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Type Viewbox}}, Path = ActualWidth} "', otrzymuję dokładnie to, po co jestem. To: http://i54.tinypic.com/2mo8qk5.jpg Dziękuję bardzo za pomoc. – MajorRefactoring

+0

Dzięki za to. To działało dla mnie również w skrzynce na listy. – MikeKulls

+1

Nie działa dla mnie w aplikacji Windows Store. Powoduje transformację skali obiektu, czcionek, wysokości i szerokości. Oryginalna odpowiedź zadziałała jednak zgodnie z oczekiwaniami. –

5

Niespodziewanie ustawienie ScrollViewer.HorizontalScrollBarVisibility="Disabled" również pracował dla mnie:

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