【问题标题】:Display a UI element (Image, Text) in Data Template of a List View on click of List View Item单击列表视图项时,在列表视图的数据模板中显示 UI 元素(图像、文本)
【发布时间】:2016-04-11 06:39:03
【问题描述】:

数据模板代码

 <DataTemplate x:Key="CachelvTemplate">
            <Grid Margin="21,3,21,3" Height="60">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding}" HorizontalAlignment="Stretch" VerticalAlignment="Center" Foreground="Black"  FontSize="20"/>
                <Image Grid.Column="2" Source="/Assets/Icons/selectedCache.png" HorizontalAlignment="Right"  VerticalAlignment="Center" Stretch="Fill" MaxHeight="20" MaxWidth="20" Opacity="0" />
            </Grid>
 </DataTemplate>

列表查看代码

 <ListView x:Name="cacheList" Tapped="cacheList_ItemClick"                     
                      ItemTemplate="{StaticResource CachelvTemplate}" />

现在单击列表项时,我想将图像的不透明度(来自数据模板)更改为一个,或者以某种方式使其可见。仅适用于选定的列表视图项。

【问题讨论】:

    标签: c# xaml windows-phone-8.1 win-universal-app


    【解决方案1】:

    首先,您应该使用 ItemClick 或 SelectionChanged 事件而不是 Tapped。我将使用SelectionChanged 事件。您可以使用VisualTreeHelper 来获取所选项目的图像控制

    private void cacheList_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                foreach (var item in e.AddedItems)
                {
                    ListViewItem selectedItem = (sender as ListView).ContainerFromItem(item) as ListViewItem;
                    Image image = FindElementInVisualTree<Image>(selectedItem);
                    if(image!=null)
                    {
                        image.Visibility = Visibility.Visible;
                    }
                }
            }
            private T FindElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
            {
                var count = VisualTreeHelper.GetChildrenCount(parentElement);
                if (count == 0) return null;
    
                for (int i = 0; i < count; i++)
                {
                    var child = VisualTreeHelper.GetChild(parentElement, i);
                    if (child != null && child is T)
                        return (T)child;
                    else
                    {
                        var result = FindElementInVisualTree<T>(child);
                        if (result != null)
                            return result;
                    }
                }
                return null;
            }
    

    更新以使未选择的项目图像折叠

     private void cacheList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            foreach (var item in e.AddedItems)
            {
                ListViewItem selectedItem = (sender as ListView).ContainerFromItem(item) as ListViewItem;
                Image image = FindElementInVisualTree<Image>(selectedItem);
                if (image != null)
                {
                    image.Visibility = Visibility.Visible;
                }
                FindListViewItem((sender as ListView), selectedItem);
            }
        }
        private void FindListViewItem(DependencyObject parent,ListViewItem selectedItem)
        {
            var count = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < count; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                if (child is ListViewItem && (child as ListViewItem) != selectedItem)
                {
                    Image unselectedimage = FindElementInVisualTree<Image>(child);
                    if (unselectedimage != null)
                    {
                        unselectedimage.Visibility = Visibility.Collapsed;
                    }
                }
                else
                {
                  FindListViewItem(child, selectedItem);
                }
    
            }
        }
    

    【讨论】:

    • 是的,这就像一个魅力,但我的整个用例并不完整。当我选择不同的列表项时,我希望未选择的列表项中的图像不可见。有什么想法吗?
    • 我有一个列表视图。选定的列表项将突出显示(背景颜色已更改)并显示一个刻度线。刻度线是只需要为所选项目列表视图显示的图像。现在,发生的情况是,一旦选中该刻度线,即使未选中该刻度线也将继续可见。因此,我需要仅对所选列表项可见刻度线。详情请看链接中的图片[链接]drive.google.com/open?id=0B4JsxIX3-8pNRXZJckN5dVRSQTg
    • 是的,我理解这个问题。您是否使用 MVVM 概念?如果是,请发布代码
    • 如果您使用的是 MVVM。还有一个属性可以说是 IsSelected。将其绑定到图像控件可见性。在选择更改时,使选定项目。IsSelected 为可见,其他项目 IsSelected 为 Collapsed
    • 是的,我正在使用 MVVM 概念。列表视图是用于 Metro 应用程序的 Flyout 和电话应用程序的页面中的用户控件。 (开发通用应用程序)
    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多