UWP如何获取ListviewItem当前单击并以前单击过

时间:2016-03-11 06:52:06

标签: windows-runtime windows-phone-8.1 win-universal-app universal

我正在开发UWP App,我有一个Listview绑定类,其中最多10个项目。 Listview有一个DataTemplate,Usercontrol在这个DataTemplate中。

我想点击任何项目,以便动画(故事板)应该开始,ColorBand应该向右展开,当我点击另一个项目时,现在展开(先前点击的)ColorBand应该折叠,当前点击的项目的ColorBand应该展开

如果我将此ColorBand放在Listviewitem样式中并使用Visual State Manager,这种方法是可行的,但实际上我需要在运行时通过类动态地设置边框颜色和角半径等,如果是用户想要改变颜色等...所以必须通过绑定。

所以我需要同时在当前点击的项目和之前点击的项目上运行动画。请帮忙,我因此而陷入困境。

2 个答案:

答案 0 :(得分:1)

<VisualStateGroup x:Name="SelectionStates">
                                    <VisualState x:Name="Unselected"/>
                                    <VisualState x:Name="Selected">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="InnerGrid">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding ColorBand}"/>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="White"/>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="FontWeight" Storyboard.TargetName="ContentPresenter">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="ExtraBold"/>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>

                                </VisualStateGroup>

使用SelectionChanged方法

     private async void Selectionchanged(object sender, SelectionChangedEventArgs args)
        {
        foreach(var item in args.AddedItems)
        {
ListViewItem item = (sender as ListView).ContainerFromItem(item) as ListViewItem;
    // you will get slected item here. Use that item to get listbox item
        }
    if(args.RemovedItems!=null)
    {
        foreach(var item in args.RemovedItems)
        {
    //You will get previosly selcted item here
ListViewItem item = (sender as ListView).ContainerFromItem(item) as ListViewItem
        }
    }

      }

答案 1 :(得分:0)

我认为获取之前点击项目的最简单方法是通过带有两个属性的c#代码。而且你可以随意使用这个项目。使用选择更改事件,当它引发时,您应该将此选定项目添加到新属性,如下所示:

public object PreviouslySelectedItem {get; set;}
public object CurrentlySelectedItem 
{
get;
set{
       PreviouslySelectedItem = CurrentlySelectedItem ;
       CurrentlySelectedItem = value;
    }
}

private async void Selectionchanged(object sender, SelectionChangedEventArgs args)
    {
        CurrentlySelectedItem = (sender as ListBox).SelectedItem;

        // some handling with null cases and etc.
        // now you can apply your animation on your two items
    }