我正在开发UWP App,我有一个Listview绑定类,其中最多10个项目。 Listview有一个DataTemplate,Usercontrol在这个DataTemplate中。
我想点击任何项目,以便动画(故事板)应该开始,ColorBand应该向右展开,当我点击另一个项目时,现在展开(先前点击的)ColorBand应该折叠,当前点击的项目的ColorBand应该展开
如果我将此ColorBand放在Listviewitem样式中并使用Visual State Manager,这种方法是可行的,但实际上我需要在运行时通过类动态地设置边框颜色和角半径等,如果是用户想要改变颜色等...所以必须通过绑定。
所以我需要同时在当前点击的项目和之前点击的项目上运行动画。请帮忙,我因此而陷入困境。
答案 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
}