MouseLeftButtonDown 事件不会在子 ContentControl 中触发
本文关键字:ContentControl 事件 MouseLeftButtonDown | 更新日期: 2023-09-27 18:37:05
我有PortItem
派生自ContentControl
,TextedStackPanel
派生自包含PortItems
的StackPanel
。在MainWindow
,我有 2 个包含 TextedStackPanels
StackPanels
.PortItem
我覆盖了MouseLeftButtonDown
方法。但是当我在这种方法上执行此操作时,不会触发。我在论坛中搜索了一下,发现Grid/StackPanel
的属性必须设置为透明Background
。我应用了这个,但没有变化。怎么办?
编辑 1我使用分部类。我有2节课:PortItem.cs
和PortItem.cs.xaml
。我修改了此 XAML 文件中的任何视觉更改。
编辑 2此外,不会触发任何鼠标事件。当我将鼠标保持在PortItem
上时,我使用的 IsMouseOver 触发器也不起作用
XAML
<ContentControl x:Class="**.PortItem"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:UI="clr-namespace:**.UIData" Width="17" Height="17" Margin="3" SnapsToDevicePixels="True" >
<Grid Background="Transparent" Name="mainGrid">
<!-- transparent extra space makes connector easier to hit -->
<Rectangle Fill="Transparent" Margin="-2"/>
<Border BorderBrush="Green" x:Name="border" BorderThickness="2">
<Border.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}, Path=IsMouseOver}" Value="True">
<Setter Property="Border.BorderBrush" Value="Blue"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter Property="Border.BorderBrush" Value="Blue"/>
</DataTrigger>
<!--<DataTrigger Binding="{Binding ContactPort}" Value="{x:Null}">
<Setter TargetName="border" Property="Border.BorderBrush" Value="Green"/>
</DataTrigger>-->
</Style.Triggers>
</Style>
</Border.Style>
<Image Source="/**;component/Resources/1337238611_port.png">
</Image>
</Border>
</Grid>
确保未在 PortItem 上将 'IsHitTestVisible' 设置为 false。 此外,请确保没有其他控件位于其顶部。 如果是,请将其"IsHitTestVisible"属性设置为 false,然后 PortItem 控件将获取鼠标右键单击事件。 为了确保上面没有任何东西,请将您的 PortItem 声明为添加到 TextedStackPanel 的最后一项。 若要仔细检查顶部没有其他内容,请将其他控件的背景颜色更改为非常明显的颜色(仅用于测试),以查看是否有任何东西覆盖了 PortItem 控件。 此外,更改 PortItem 控件上的颜色,以验证它是否确实在你认为的位置。 然后,一旦一切正常,将颜色更改回其原始颜色。
如果您能向我们提供 XAML 的代码示例,这可能会有所帮助。 如果要在代码隐藏中动态添加 PortItems,请同时提供该代码。
编辑:根据您对代码所做的更改,尝试将 ClipToBounds="False" 添加到用户控件声明的顶部。
<ContentControl x:Class="**.PortItem" ClipToBounds="False"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:UI="clr-namespace:**.UIData" Width="17" Height="17" Margin="3" SnapsToDevicePixels="True" >
您是否为端口项创建了模板?我创建了以下类来复制您的 PortItem 和基上的断点。OnMouseButtonDown 行并触发,我认为您的方法未执行的原因是因为没有可视元素供鼠标实际交互,请尝试将下面的样式添加到您的应用程序中,您应该会看到该方法正确触发。
public class PortItem: ContentControl
{
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
}
}
然后在 XAML 中,我创建了一个样式来为其提供要呈现的内容。
<local:PortItem Margin="44,36,156,95">
<local:PortItem.Style>
<Style TargetType="{x:Type local:PortItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:PortItem}">
<Border Background="Transparent">
<ContentPresenter Content="{TemplateBinding Content}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</local:PortItem.Style>
</local:PortItem>
您提到的背景是透明的,您可以在边框控件中看到,如果您省略背景是正确的,则事件永远不会触发。