在UWP項目的固定數量的佈局問題,我有一個綁定到Person
的ObservableCollection<T>
對象ListView
。我使用DataTemplate
在ListView
內顯示Person
對象。收藏(人物)最多隻能包含由_maxPeopleCount
設置的特定人數。試圖讓ListView控件顯示項目
我想發生這樣對於ListView
到:
- 一點也不滾動。
- 顯示由
_maxPeopleCount
作爲定義的所有Person
對象。 - 完全顯示每個
Person
對象,而不是部分顯示。也就是說,顯示每個項目,以便ListViewItem.Height =(可從ItemsPanel得到的高度)/_maxPeopleCount
。 - 當存在小於
_maxPeopleCount
項開始仍然顯示如(3)中定義的有高度的添加的條目。 - 顯示每個人的名字和姓氏儘可能大。
目前,我不能讓我的項目做到這一點。
任何人都可以在這方面幫助,請或建議另一種方法?
下面是示例代碼顯示的問題。只需按下按鈕7次以上,因爲這是代碼中的_maxPeopleCount
。你會看到7個人沒有看到。對可怕的用戶界面抱歉。它使用最小的XAML顯示問題,但與我的真實項目類似。
許多在此先感謝您的幫助。
後面的代碼:
public sealed partial class MainPage : Page
{
ObservableCollection<Person> _people = new ObservableCollection<Person>();
int _personCount = 0;
int _maxPeopleCount = 7;
public MainPage()
{
this.InitializeComponent();
this.DataContext = _people;
}
private void btnAddPerson_Click(object sender, RoutedEventArgs e)
{
if (_people.Count == _maxPeopleCount)
{
_people.RemoveAt(_people.Count - 1);
}
_personCount += 1;
_people.Insert(0, new Person($"FirstName {_personCount}", $"LastName {_personCount}"));
}
XAML:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Grid.Column="0" x:Name="btnAddPerson" Click="btnAddPerson_Click" Content="Add Person" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<ListView BorderBrush="Black" BorderThickness="5" Margin="10" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding}" ScrollViewer.VerticalScrollMode="Disabled" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollMode="Disabled" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel HorizontalAlignment="Stretch"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<Grid x:Name="grdPerson">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="Green" HorizontalAlignment="Stretch">
<Viewbox>
<TextBlock Text="{Binding FirstName}" HorizontalAlignment="Stretch"/>
</Viewbox>
</Border>
<Border Grid.Column="1" Background="Yellow" HorizontalAlignment="Stretch">
<Viewbox>
<TextBlock Text="{Binding LastName}" HorizontalAlignment="Stretch" />
</Viewbox>
</Border>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
Person類:
public class Person : INotifyPropertyChanged
{
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
private string _firstName = string.Empty;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
OnPropertyChanged();
}
}
private string _lastName = string.Empty;
public string LastName
{
get { return _lastName; }
set
{
_lastName = value;
OnPropertyChanged();
}
}
protected void OnPropertyChanged([CallerMemberName] string caller = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(caller));
}
public event PropertyChangedEventHandler PropertyChanged;
}
你需要的ListViewItems可以進行選擇?你需要處理ItemClick事件嗎? –
@DecadeMoon,不需要ListViewItems是可選的,我不需要處理ItemClick事件。 ListView純粹是隻讀的。 – Cleve