【问题标题】:How to expand a ListView Item on SelectionChanged event in Windows 10?如何在 Windows 10 中的 SelectionChanged 事件上展开 ListView 项?
【发布时间】:2016-03-21 16:37:09
【问题描述】:

我目前正在使用 Windows 10,并且我正在使用 ListView 根据我的要求显示项目。现在我想在用户单击 ListView Item 时在同一页面上展开 ListView,并为他提供一些选项以简化用户体验。

我知道如何使用 DataTemplate 实现 ListView 和显示项目,但我不确定是否可以使用 ListView 实现我的要求。

我想实现以下目标:

我想在 ListView 项目单击时显示联系人、添加照片等选项。我也尝试使用 PopupMenu 来实现相同的目的,但它有最多添加 6 个命令的限制,而且我有更多的命令。我想动态添加这些选项。

【问题讨论】:

  • 我不太了解您的需求。但我会试一试:当用户点击按钮时,使用按钮和 Flyout 显示带有预定义内容的弹出窗口?

标签: c# winrt-xaml win-universal-app windows-10


【解决方案1】:

这是您想要的基本实现。

使用此 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;
}

看起来像这样:

有意义吗?当然,还有更多工作要做。但这应该可以帮助您入门。

祝你好运。

【讨论】:

  • 非常感谢。它真的奏效了。您能否建议一些 API 在下载图像后更改图像像素颜色而不会导致性能问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多