MouseLeftButtonDown 事件不会在子 ContentControl 中触发

本文关键字:ContentControl 事件 MouseLeftButtonDown | 更新日期: 2023-09-27 18:37:05

我有PortItem派生自ContentControlTextedStackPanel派生自包含PortItemsStackPanel。在MainWindow,我有 2 个包含 TextedStackPanels StackPanels.PortItem我覆盖了MouseLeftButtonDown方法。但是当我在这种方法上执行此操作时,不会触发。我在论坛中搜索了一下,发现Grid/StackPanel的属性必须设置为透明Background。我应用了这个,但没有变化。怎么办?

编辑 1我使用分部类。我有2节课:PortItem.csPortItem.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>

MouseLeftButtonDown 事件不会在子 ContentControl 中触发

确保未在 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>

您提到的背景是透明的,您可以在边框控件中看到,如果您省略背景是正确的,则事件永远不会触发。