uwp 如何一次调整模板项目源中项目的大小?
uwp how to resize items in a templated item source all at once?
我有这个列表视图,我想根据 window 的大小变化动态调整项目的属性(字体大小、宽度和高度等)。到目前为止,我已经能够通过在 c# 中一个一个地修改项目源的元素布局(使用 for 循环)来做到这一点。随着列表视图项目数量的增加,效果稍后会出现故障。不知道有没有办法统一修改listview中这些模板化项的样式。我试过使用和修改应用于模板的 staticResource 样式,但无济于事。
<ListView
x:Name="leftMenubar"
Grid.Column="0"
Height="auto"
VerticalAlignment="Top"
VerticalContentAlignment="Stretch"
IsItemClickEnabled="True"
ItemClick="LeftBarMenuItemClicked"
ItemsSource="{x:Bind Items}"
Loaded="LeftMenubar_Loaded">
<ListView.Resources>
<SolidColorBrush x:Key="ListViewItemBackgroundPointerOver" Color="Transparent" />
<SolidColorBrush x:Key="ListViewItemBackgroundPressed" Color="Transparent" />
<SolidColorBrush x:Key="ListViewItemBackgroundSelectedPressed" Color="Transparent" />
<SolidColorBrush x:Key="ListViewItemBackgroundSelected" Color="Transparent" />
<SolidColorBrush x:Key="ListViewItemBackgroundSelectedPointerOver" Color="Transparent" />
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel
Margin="0"
VerticalAlignment="Top"
GroupPadding="0"
Orientation="Vertical" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:LeftMenuBarItem">
<StackPanel Margin="0,0,0,0" Padding="{x:Bind Pad, Mode=OneWay}">
<BitmapIcon
Height="{x:Bind IconHeight, Mode=OneWay}"
MinHeight="20"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Stretch"
Foreground="{x:Bind Foreground, Mode=OneWay}"
UriSource="{x:Bind ImgPath}" />
<TextBlock
Width="Auto"
Margin="0,5,0,0"
HorizontalAlignment="Center"
FontSize="10"
Foreground="{x:Bind Foreground, Mode=OneWay}"
Text="{x:Bind Title}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
您可以通过几种不同的方式完成此操作。您可以设置数据模板以将字体大小绑定到控件的高度并在那里计算。但是随后您会为列表中的每个项目触发一个转换器。
我认为最好的方法是为 ListViewItem
设置一个绑定到 ListView
上的 FontSize
(和其他属性)这是一个如何设置的示例这个起来
class AdjustableListView : ListView
{
public AdjustableListView()
{
SizeChanged += OnSizeChanged;
}
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
var listItem = (ListViewItem)element;
var binding = new Binding { Source = this, Path = new PropertyPath("FontSize")};
listItem.SetBinding(ListViewItem.FontSizeProperty, binding);
}
private void OnSizeChanged(object sender, SizeChangedEventArgs e)
{
FontSize = Math.Max(12, e.NewSize.Height / 24);
}
}
用户控件允许您封装您打算经常使用的 XAML 的常见段落,无论是在单个页面上还是在整个应用程序中。但是,当您想在采用自适应布局时更改 GridView 或 ListView 的数据模板大小时,用户控件最有用,我认为这是完成任务的最佳方法。
此视频向您展示了操作方法。
Bob Tabor explaining how to utilize User Controls as Data Templates
我有这个列表视图,我想根据 window 的大小变化动态调整项目的属性(字体大小、宽度和高度等)。到目前为止,我已经能够通过在 c# 中一个一个地修改项目源的元素布局(使用 for 循环)来做到这一点。随着列表视图项目数量的增加,效果稍后会出现故障。不知道有没有办法统一修改listview中这些模板化项的样式。我试过使用和修改应用于模板的 staticResource 样式,但无济于事。
<ListView
x:Name="leftMenubar"
Grid.Column="0"
Height="auto"
VerticalAlignment="Top"
VerticalContentAlignment="Stretch"
IsItemClickEnabled="True"
ItemClick="LeftBarMenuItemClicked"
ItemsSource="{x:Bind Items}"
Loaded="LeftMenubar_Loaded">
<ListView.Resources>
<SolidColorBrush x:Key="ListViewItemBackgroundPointerOver" Color="Transparent" />
<SolidColorBrush x:Key="ListViewItemBackgroundPressed" Color="Transparent" />
<SolidColorBrush x:Key="ListViewItemBackgroundSelectedPressed" Color="Transparent" />
<SolidColorBrush x:Key="ListViewItemBackgroundSelected" Color="Transparent" />
<SolidColorBrush x:Key="ListViewItemBackgroundSelectedPointerOver" Color="Transparent" />
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel
Margin="0"
VerticalAlignment="Top"
GroupPadding="0"
Orientation="Vertical" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:LeftMenuBarItem">
<StackPanel Margin="0,0,0,0" Padding="{x:Bind Pad, Mode=OneWay}">
<BitmapIcon
Height="{x:Bind IconHeight, Mode=OneWay}"
MinHeight="20"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Stretch"
Foreground="{x:Bind Foreground, Mode=OneWay}"
UriSource="{x:Bind ImgPath}" />
<TextBlock
Width="Auto"
Margin="0,5,0,0"
HorizontalAlignment="Center"
FontSize="10"
Foreground="{x:Bind Foreground, Mode=OneWay}"
Text="{x:Bind Title}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
您可以通过几种不同的方式完成此操作。您可以设置数据模板以将字体大小绑定到控件的高度并在那里计算。但是随后您会为列表中的每个项目触发一个转换器。
我认为最好的方法是为 ListViewItem
设置一个绑定到 ListView
上的 FontSize
(和其他属性)这是一个如何设置的示例这个起来
class AdjustableListView : ListView
{
public AdjustableListView()
{
SizeChanged += OnSizeChanged;
}
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
var listItem = (ListViewItem)element;
var binding = new Binding { Source = this, Path = new PropertyPath("FontSize")};
listItem.SetBinding(ListViewItem.FontSizeProperty, binding);
}
private void OnSizeChanged(object sender, SizeChangedEventArgs e)
{
FontSize = Math.Max(12, e.NewSize.Height / 24);
}
}
用户控件允许您封装您打算经常使用的 XAML 的常见段落,无论是在单个页面上还是在整个应用程序中。但是,当您想在采用自适应布局时更改 GridView 或 ListView 的数据模板大小时,用户控件最有用,我认为这是完成任务的最佳方法。
此视频向您展示了操作方法。
Bob Tabor explaining how to utilize User Controls as Data Templates