如何在 Windows 10 中扩展 SelectionChanged 事件中的 ListView 项目?
How to expand a ListView Item on SelectionChanged event in Windows 10?
我目前正在使用 Windows 10,我正在使用 ListView 根据我的要求显示项目。现在我想在用户点击 ListView Item 时在同一页面上扩展 ListView 并为其提供一些选项以简化用户体验。
我知道如何使用 DataTemplate 实现 ListView 和显示项目,但我不确定是否可以使用 ListView 实现我的要求。
我想实现如下目标:
我想在单击 ListView 项目时显示联系人、添加照片等选项。我也尝试使用 PopupMenu 实现相同的效果,但它有添加最多 6 个命令的限制,而我有比这更多的命令。我想动态添加这些选项。
这是您想要的基本实现。
使用此 ListView XAML:
<ListView SelectionChanged="ListView_SelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<Panel.Resources>
<Style x:Name="MainAreaStyle" TargetType="Image">
<Setter Property="Width" Value="300" />
<Setter Property="Margin" Value="0" />
</Style>
<Style x:Name="DetailAreaStyle" TargetType="Rectangle">
<Setter Property="Height" Value="150" />
<Setter Property="Height" Value="300" />
<Setter Property="Margin" Value="0,0,0,8" />
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</Panel.Resources>
<Image Source="http://i.stack.imgur.com/L5sb9.png" Style="{StaticResource MainAreaStyle}" />
<Rectangle x:Name="DetailArea" Fill="DarkBlue" Style="{StaticResource DetailAreaStyle}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
<x:String>One</x:String>
<x:String>Two</x:String>
<x:String>Three</x:String>
</ListView>
使用此代码隐藏:
UIElement previous = null;
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (previous != null) previous.Visibility = Visibility.Collapsed;
if (e.AddedItems.Any())
{
var container = (sender as ListView).ContainerFromItem(e.AddedItems.First());
(previous = Child<Rectangle>(container, "DetailArea")).Visibility = Visibility.Visible;
}
}
public T Child<T>(DependencyObject parent, string name) where T : FrameworkElement
{
return Children(parent).OfType<T>().FirstOrDefault(x => x.Name == name);
}
public List<DependencyObject> Children(DependencyObject parent)
{
var list = new List<DependencyObject>();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i) as DependencyObject;
if (child != null)
{
list.Add(child);
list.AddRange(Children(child));
}
}
return list;
}
看起来像这样:
有道理吗?当然,还有更多工作要做。但这应该可以帮助您入门。
祝你好运。
我目前正在使用 Windows 10,我正在使用 ListView 根据我的要求显示项目。现在我想在用户点击 ListView Item 时在同一页面上扩展 ListView 并为其提供一些选项以简化用户体验。
我知道如何使用 DataTemplate 实现 ListView 和显示项目,但我不确定是否可以使用 ListView 实现我的要求。
我想实现如下目标:
我想在单击 ListView 项目时显示联系人、添加照片等选项。我也尝试使用 PopupMenu 实现相同的效果,但它有添加最多 6 个命令的限制,而我有比这更多的命令。我想动态添加这些选项。
这是您想要的基本实现。
使用此 ListView XAML:
<ListView SelectionChanged="ListView_SelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<Panel.Resources>
<Style x:Name="MainAreaStyle" TargetType="Image">
<Setter Property="Width" Value="300" />
<Setter Property="Margin" Value="0" />
</Style>
<Style x:Name="DetailAreaStyle" TargetType="Rectangle">
<Setter Property="Height" Value="150" />
<Setter Property="Height" Value="300" />
<Setter Property="Margin" Value="0,0,0,8" />
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</Panel.Resources>
<Image Source="http://i.stack.imgur.com/L5sb9.png" Style="{StaticResource MainAreaStyle}" />
<Rectangle x:Name="DetailArea" Fill="DarkBlue" Style="{StaticResource DetailAreaStyle}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
<x:String>One</x:String>
<x:String>Two</x:String>
<x:String>Three</x:String>
</ListView>
使用此代码隐藏:
UIElement previous = null;
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (previous != null) previous.Visibility = Visibility.Collapsed;
if (e.AddedItems.Any())
{
var container = (sender as ListView).ContainerFromItem(e.AddedItems.First());
(previous = Child<Rectangle>(container, "DetailArea")).Visibility = Visibility.Visible;
}
}
public T Child<T>(DependencyObject parent, string name) where T : FrameworkElement
{
return Children(parent).OfType<T>().FirstOrDefault(x => x.Name == name);
}
public List<DependencyObject> Children(DependencyObject parent)
{
var list = new List<DependencyObject>();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i) as DependencyObject;
if (child != null)
{
list.Add(child);
list.AddRange(Children(child));
}
}
return list;
}
看起来像这样:
有道理吗?当然,还有更多工作要做。但这应该可以帮助您入门。
祝你好运。