TreeViewItem.Header TreeViewItem 上的 C# WPF TreeViewItem MouseDoubleClick 事件
C# WPF TreeViewItem MouseDoubleClick event on TreeViewItem with TreeViewItem.Header
我有一个 TreeView
,其中包含不同级别的 TreeViewItem
的混合物。
以下完美运行:
<TreeViewItem Tag="Link" MouseDoubleClick="TreeViewItem_MouseDoubleClick">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="Link" Margin="0 0 5 0"/>
<TextBlock Text="Link"/>
</StackPanel>
</TreeViewItem.Header>
</TreeViewItem>
但是当涉及到他们有 TreeViewItem.Header
的那些时,我无法正确设置 MouseDoubleClick
事件,请参见下文:
<TreeViewItem IsExpanded="True" MouseDoubleClick="TreeViewItem_MouseDoubleClick">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="HelpCircleOutline" Margin="0 0 5 0"/>
<TextBlock Text="Help" FontWeight="Bold"/>
</StackPanel>
</TreeViewItem.Header>
<ContentControl>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="BookOpenOutline" Margin="0 0 5 0"/>
<TextBlock Text="Technical Guide"/>
</StackPanel>
</ContentControl>
</TreeViewItem>
上面的问题是它在帮助 header 和技术指南 child 上触发。
我无法将事件添加到 <StackPanel>
上,因为它不支持它,所以我用 <ContentControl>
包装它并尝试将事件添加到其中,但它似乎没有完全触发。
有什么方法可以只让“技术指南”触发事件,同时根据第一个代码片段添加 Tag=""
属性,因为我正在检查该值TreeViewItem_MouseDoubleClick
事件?
编辑
根据要求为 MouseDoubleClick
事件提供代码:
private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (sender is TreeViewItem item)
{
var header = item.Tag as string;
switch (header)
{
case "Link":
//Open new window code
break;
}
}
为什么不捕获来自树视图的点击,而不是捕获来自文本块的点击?
<TreeViewItem IsExpanded="True" >
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="HelpCircleOutline" Margin="0 0 5 0"/>
<TextBlock Text="Help" FontWeight="Bold" MouseDown="TextBlock_MouseDown"/>
</StackPanel>
</TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="BookOpenOutline" Margin="0 0 5 0"/>
<TextBlock Text="Technical Guide" MouseDown="TextBlock_MouseDown"/>
</StackPanel>
</TreeViewItem>
private void TextBlock_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// simulate doubleclick
if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 2)
{
System.Diagnostics.Debug.WriteLine((TextBlock)sender.Text);
}
}
I cannot add the event onto the <StackPanel>
as it doesn't support it ...
是的,如果您将 Background
属性 设置为 Transparent
并处理 MouseLeftButtonDown
事件并检查 ClickCount
属性的 MouseButtonEventArgs
:
private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 2)
{
//double-click detected
}
}
XAML:
<StackPanel Orientation="Horizontal"
Background="Transparent"
MouseLeftButtonDown="StackPanel_MouseLeftButtonDown">
<TextBlock Text="Technical Guide"/>
</StackPanel>
我有一个 TreeView
,其中包含不同级别的 TreeViewItem
的混合物。
以下完美运行:
<TreeViewItem Tag="Link" MouseDoubleClick="TreeViewItem_MouseDoubleClick">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="Link" Margin="0 0 5 0"/>
<TextBlock Text="Link"/>
</StackPanel>
</TreeViewItem.Header>
</TreeViewItem>
但是当涉及到他们有 TreeViewItem.Header
的那些时,我无法正确设置 MouseDoubleClick
事件,请参见下文:
<TreeViewItem IsExpanded="True" MouseDoubleClick="TreeViewItem_MouseDoubleClick">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="HelpCircleOutline" Margin="0 0 5 0"/>
<TextBlock Text="Help" FontWeight="Bold"/>
</StackPanel>
</TreeViewItem.Header>
<ContentControl>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="BookOpenOutline" Margin="0 0 5 0"/>
<TextBlock Text="Technical Guide"/>
</StackPanel>
</ContentControl>
</TreeViewItem>
上面的问题是它在帮助 header 和技术指南 child 上触发。
我无法将事件添加到 <StackPanel>
上,因为它不支持它,所以我用 <ContentControl>
包装它并尝试将事件添加到其中,但它似乎没有完全触发。
有什么方法可以只让“技术指南”触发事件,同时根据第一个代码片段添加 Tag=""
属性,因为我正在检查该值TreeViewItem_MouseDoubleClick
事件?
编辑
根据要求为 MouseDoubleClick
事件提供代码:
private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (sender is TreeViewItem item)
{
var header = item.Tag as string;
switch (header)
{
case "Link":
//Open new window code
break;
}
}
为什么不捕获来自树视图的点击,而不是捕获来自文本块的点击?
<TreeViewItem IsExpanded="True" >
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="HelpCircleOutline" Margin="0 0 5 0"/>
<TextBlock Text="Help" FontWeight="Bold" MouseDown="TextBlock_MouseDown"/>
</StackPanel>
</TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="BookOpenOutline" Margin="0 0 5 0"/>
<TextBlock Text="Technical Guide" MouseDown="TextBlock_MouseDown"/>
</StackPanel>
</TreeViewItem>
private void TextBlock_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// simulate doubleclick
if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 2)
{
System.Diagnostics.Debug.WriteLine((TextBlock)sender.Text);
}
}
I cannot add the event onto the
<StackPanel>
as it doesn't support it ...
是的,如果您将 Background
属性 设置为 Transparent
并处理 MouseLeftButtonDown
事件并检查 ClickCount
属性的 MouseButtonEventArgs
:
private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 2)
{
//double-click detected
}
}
XAML:
<StackPanel Orientation="Horizontal"
Background="Transparent"
MouseLeftButtonDown="StackPanel_MouseLeftButtonDown">
<TextBlock Text="Technical Guide"/>
</StackPanel>