关于wpf中treeview的右击事件

zhoutengxiao 2011-04-12 11:53:31
我用HierarchicalDataTemplate绑定treeview的数据后,怎么添加treeviewitem的右击事件?这是xaml中的代码
 <TreeView Name="treeView2" Margin="3,62,0,0" HorizontalAlignment="Left" Width="317" TreeViewItem.Selected="treeView2_Selected">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:PropertyNodeItem}" ItemsSource="{Binding Path=Children}" >
<StackPanel Orientation="Horizontal">
<Image VerticalAlignment="Center" Source="{Binding Icon}" Width="16" Height="16" Margin="0,0,2,2"></Image>
<TextBlock VerticalAlignment="Center" Text="{Binding DisplayName}" ></TextBlock>
<Image VerticalAlignment="Center" Source="{Binding EditIcon}" Margin="2,0,0,0"></Image>
<StackPanel.ToolTip>
<TextBlock VerticalAlignment="Center" Text="{Binding Name}" TextWrapping="Wrap" MaxWidth="200" ></TextBlock>
</StackPanel.ToolTip>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>

treeviewitem的一些事件应该怎么添加?
...全文
440 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoutengxiao 2011-04-13
  • 打赏
  • 举报
回复
恩,现在明白怎么做了!主要是我绑定的是数据源,怎么获取一个孩子节点的父节点?
zhoutengxiao 2011-04-12
  • 打赏
  • 举报
回复
恩,这个无法获取treeviewitem的一些信息,苦闷中
沝林 2011-04-12
  • 打赏
  • 举报
回复
可以在ItemTemplate里捕捉StackPanel的右键事件
zhoutengxiao 2011-04-12
  • 打赏
  • 举报
回复
我要的是treeviewitem的事件,你说的那个事件我不用跑到这来问,不过还是谢谢你
单线程加锁 2011-04-12
  • 打赏
  • 举报
回复
private void treeView2_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{

}
MouseRightButtonDown="treeView2_MouseRightButtonDown">
<TreeView.ItemTemplate>
沝林 2011-04-12
  • 打赏
  • 举报
回复
如果是查询慢,可以通过异步绑定, ItemsSource="{Binding Children, IsAsync=True...

如果是显示慢,可以考虑部分加载,先加载最上层的节点,展开父节点时候再加载显示子节点
zhoutengxiao 2011-04-12
  • 打赏
  • 举报
回复
太感谢你了
zhoutengxiao 2011-04-12
  • 打赏
  • 举报
回复
恩 现在的问题是怎么加树的打开速度?我的某个节点下有100个孩子节点,打开的特别慢,不知道是怎么回事
沝林 2011-04-12
  • 打赏
  • 举报
回复
EventSetter是通过Style方式设置控件的事件,跟直接在<StackPanel Orientation="Horizontal" MouseLeftButtonDown="treeview_ButtonDown"/> 是一样的,如果Style的TargetType对象没有对应的事件,一样不能使用
沝林 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhoutengxiao 的回复:]
恩,这个无法获取treeviewitem的一些信息,苦闷中
[/Quote]

可以的,你可以使用Command,然后把需要的信息用CommandParameter传给Command的处理方法就可以了
具体方法:
在Blend设计器中,选中StackPanel,在资产面板中双击选择行为,会生成如下的代码:
<StackPanel Orientation="Horizontal">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<i:InvokeCommandAction Command="{Binding CustomCommand}" CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<Image...
...
</StackPanel>

上面要将绑定项的DataContext数据传给Command方法,如果要将treeview传给Command方法,则使用:CommandParameter="{Binding ElementName=treeView2}"

关于如何使用Command可以查找下微软的帮助

其实StackPanel的DataContext就是绑定的数据项,如果你只要取绑定行的数据,那么直接从sender里获取DataContext就可以了
zhoutengxiao 2011-04-12
  • 打赏
  • 举报
回复
我的意思是怎么给HierarchicalDataTemplate绑定数据后的treeview的treeviewitem绑定事件,而不是仅仅这个右击事件
在网上好像有这种说法
<Style TargetType="TreeViewItem">
<EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="TreeViewItem_PreviewMouseRightButtonDown"/>
</Style>
这段代码有问题,看上去貌似是注册事件的,就是不会用
zhoutengxiao 2011-04-12
  • 打赏
  • 举报
回复
我试了一下,还是不行
单线程加锁 2011-04-12
  • 打赏
  • 举报
回复
为啥不行?

private void treeView2_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
TreeViewItem aa = (TreeViewItem)this.treeView2.SelectedItem;

if (aa.Header.ToString().Trim() == "2")
{
MessageBox.Show("aaaaa");
}
}

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧