我要在用户按住后长时间按住button
,然后向左按click
,然后半秒钟后释放。
这是我到目前为止尝试过的方法,我设法抓住了第一个<ListView>
<i:EventTrigger EventName="PreviewMouseLeftButtonDown">
<i:InvokeCommandAction
Command="{Binding ListViewItemHoldCommand}"
CommandParameter="{Binding ElementName=ListViewFiles, Path=SelectedItem}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListView>
:
ListViewItemHoldCommand
在我的function
类中,我在此public void Execute(object parameter)
{
}
中抓住了这个点击:
<Window
x:Name="mainView"
</Window
<i:EventTrigger EventName="PreviewMouseLeftButtonDown">
<i:InvokeCommandAction
Command="{Binding DataContext.ListViewItemHoldCommand, ElementName=mainView}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}}"/>
</i:EventTrigger>
public void Execute(object parameter)
{
ListView listView = parameter as ListView;
if (listView != null)
{
var selectedIndex = listView.SelectedIndex;
var selectedItem = listView.SelectedItem;
}
}
接下来我需要做什么?
编辑
我也尝试这样做:
selectedIndex
但是-1
始终为selectedItem
,a = 1
b = 3
c = 2
始终为空
答案 0 :(得分:0)
它们为空,因为预览在任何事情发生之前都没有。意味着您的代码在选择listviewItem之前正在运行。
要确保选择某些内容,通常的mvvm方法是绑定selecteditem并在bound属性的设置器中起作用。
赞:
长按没有事件。您必须处理鼠标按下,引入延迟,然后检查鼠标按钮是否仍处于按下状态。
例如
private async void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListViewItem lvi = sender as ListViewItem;
await Task.Delay(500);
if (Mouse.LeftButton == MouseButtonState.Pressed)
{
Console.WriteLine("Do something here");
}
}
如果您要在项目中重复使用代码,则将其重构为行为。