Растягивание элементов в WPF ListView внутри ViewBox

У меня неприятная проблема, и я был бы признателен за помощь. У меня есть ListView внутри ViewBox, и я не могу заставить элементы в ListView растягиваться по горизонтали.

Вот 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>

Вот код с определениями объектов Skin и 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();
  }


 }
}

Количество скинов, которые могут появиться в иннинге, может меняться, и может быть изменено пользователем, поэтому я поместил ListView в ViewBox, чтобы они автоматически изменяли размер соответственно при изменении количества скинов. Полученное окно можно увидеть здесь: http://i52.tinypic.com/244wqpl.jpg

Я пробовал всевозможные комбинации HorzontalAlignment="Stretch" и HorizontalContentAlignment="Stretch" и пытался изменить шаблон ItemsPanel, но я не могу, хоть убей, понять, как заставить ListView растягиваться по горизонтали. То, что я пытаюсь сделать, невозможно без кода для динамического изменения ширины ListView? Или мне не хватает чего-то очень простого?

Мы будем очень благодарны за любую помощь, которую может предложить любой.

Спасибо,

Мэтью


person MajorRefactoring    schedule 15.09.2010    source источник


Ответы (2)


Попробуйте установить ItemContainerStyle для ListView примерно так:

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

Вам также может потребоваться установить <Viewbox Stretch="Fill"/>.

После этого, я думаю, вы можете удалить все эти другие сеттеры «HorizontalAlignment = Stretch» ​​и «HorizontalContentAlignment = Stretch» ​​в своем коде, поскольку они, вероятно, больше не понадобятся.

person ASanch    schedule 15.09.2010
comment
«Растянуть = Заполнить» !! Большое вам спасибо за это. Когда окно просмотра было растянуто, а для ListViewItem.HorizontalContentAlignment задано значение Stretch, все было близко. Он дал это: i55.tinypic.com/28cdmwh.jpg - закрыть, но текст растягивается, а не просто растягивается TextBlock. Если я также установлю ширину ListViews равной ActualWidth ViewBox с помощью этого кода: Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Viewbox}}, Path=ActualWidth}", я получу именно то, что мне нужно. Это: i54.tinypic.com/2mo8qk5.jpg Большое спасибо за вашу помощь. - person MajorRefactoring; 15.09.2010
comment
‹Растяжение окна просмотра = Заливка› У меня не работало в приложении Windows Store. Это вызывает масштабное преобразование объекта, шрифтов, высоты и ширины. Первоначальный ответ, однако, сработал так, как ожидалось. - person Nick Bauer; 05.11.2013
comment
Ошибка: ошибка пути BindingExpression: свойство «Ширина» не найдено в Project.CustomElement, Project.WindowsPhone, Version = 1.0.0.0, культура = нейтральный, PublicKeyToken = null '. BindingExpression: Path = 'Width' DataItem = Project.CustomElement, Project.WindowsPhone, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null '; целевой элемент - 'Windows.UI.Xaml.Controls.Grid' (Name = 'null'); целевое свойство - «Ширина» (тип «Двойной») - person Black Cid; 10.04.2015

Неожиданно у меня тоже сработала установка ScrollViewer.HorizontalScrollBarVisibility="Disabled":

<ListView ItemsSource="{Binding SourceList}"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled">
person fanadd    schedule 09.06.2015