根据堆栈面板中的选定项目滚动
Scroll according to selected item in stack panel
我有一个与 ItemsControl 绑定的视图模型。在那个 ItemsControl 里面我有一个堆栈面板。现在我想要的是可以使用箭头键更改所选项目。就像在附图中一样,我选择了第一个项目,当我按下第 4 个项目时,应该选择。问题是每行的项目取决于屏幕分辨率,因此在某些屏幕上每行有 4 个项目,而在某些屏幕上有 3 个。其次,当我向下移动到页面结束的位置时,滚动应该向下移动。我怎样才能做到这一点?
这是我的 xaml:
<ScrollViewer HorizontalAlignment="Center" VerticalScrollBarVisibility="Auto" Width="Auto" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" Grid.RowSpan="2" VerticalAlignment="Top" Margin="0,10,10,0">
<ItemsControl Name="productVariants">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<DockPanel MouseLeftButtonDown="ProductVariantClicked" Tag="{Binding VariantCBX}" Margin="8" MaxHeight="160" MaxWidth="200" MinWidth="200" MinHeight="160">
<Border Name="ItemBorder" CornerRadius="6" BorderBrush="Gray" Background="White" BorderThickness="2" DockPanel.Dock="Top">
<StackPanel Margin="0">
<TextBlock Name="ProductVariantOption" Text="{Binding VariantOption}" HorizontalAlignment="Center" FontWeight="Bold" FontSize="20"/>
<Image Source="{Binding ProductVariantLogoPath}" Height="80" Width="180" />
<TextBlock Text="{Binding VendorName}" HorizontalAlignment="Center" FontSize="15" FontWeight="Bold" />
<TextBlock Text="{Binding SellingPrice}" HorizontalAlignment="Center" FontSize="20" FontWeight="Bold" Foreground="Red" />
</StackPanel>
</Border>
</DockPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True" >
<Setter TargetName="ItemBorder" Property="BorderBrush" Value="Yellow"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
就像我说的,我不知道有什么干净的方法可以做到这一点。我可能会先查看您的项目的 ActualWidth(例如,您的 "ItemBorder" Border 元素)。如果您知道项目的 ActualWidth(加上任何水平边距)和 ItemsControl 的 ActualWidth,则可以计算出此时一行中有多少个元素。您将需要重新计算这个按需 - 您可以在执行滚动时重新计算(因为尺寸可能已经改变),或者您可以通过重新计算布局更改来保持最新。
要找到实际宽度,您有两种选择。一种是您可以在滚动时遍历视觉后代,直到找到您关心的元素。另一个是您可以订阅 "Loaded" 事件并记住当时的实际宽度,假设宽度不会随时间改变。
我有一个与 ItemsControl 绑定的视图模型。在那个 ItemsControl 里面我有一个堆栈面板。现在我想要的是可以使用箭头键更改所选项目。就像在附图中一样,我选择了第一个项目,当我按下第 4 个项目时,应该选择。问题是每行的项目取决于屏幕分辨率,因此在某些屏幕上每行有 4 个项目,而在某些屏幕上有 3 个。其次,当我向下移动到页面结束的位置时,滚动应该向下移动。我怎样才能做到这一点?
这是我的 xaml:
<ScrollViewer HorizontalAlignment="Center" VerticalScrollBarVisibility="Auto" Width="Auto" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" Grid.RowSpan="2" VerticalAlignment="Top" Margin="0,10,10,0">
<ItemsControl Name="productVariants">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<DockPanel MouseLeftButtonDown="ProductVariantClicked" Tag="{Binding VariantCBX}" Margin="8" MaxHeight="160" MaxWidth="200" MinWidth="200" MinHeight="160">
<Border Name="ItemBorder" CornerRadius="6" BorderBrush="Gray" Background="White" BorderThickness="2" DockPanel.Dock="Top">
<StackPanel Margin="0">
<TextBlock Name="ProductVariantOption" Text="{Binding VariantOption}" HorizontalAlignment="Center" FontWeight="Bold" FontSize="20"/>
<Image Source="{Binding ProductVariantLogoPath}" Height="80" Width="180" />
<TextBlock Text="{Binding VendorName}" HorizontalAlignment="Center" FontSize="15" FontWeight="Bold" />
<TextBlock Text="{Binding SellingPrice}" HorizontalAlignment="Center" FontSize="20" FontWeight="Bold" Foreground="Red" />
</StackPanel>
</Border>
</DockPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True" >
<Setter TargetName="ItemBorder" Property="BorderBrush" Value="Yellow"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
就像我说的,我不知道有什么干净的方法可以做到这一点。我可能会先查看您的项目的 ActualWidth(例如,您的 "ItemBorder" Border 元素)。如果您知道项目的 ActualWidth(加上任何水平边距)和 ItemsControl 的 ActualWidth,则可以计算出此时一行中有多少个元素。您将需要重新计算这个按需 - 您可以在执行滚动时重新计算(因为尺寸可能已经改变),或者您可以通过重新计算布局更改来保持最新。
要找到实际宽度,您有两种选择。一种是您可以在滚动时遍历视觉后代,直到找到您关心的元素。另一个是您可以订阅 "Loaded" 事件并记住当时的实际宽度,假设宽度不会随时间改变。