在子ContentControl中不触发MouseLeftButtonDown事件

时间:2012-06-12 13:31:47

标签: c# wpf contentcontrol mouseleftbuttondown

PortItem派生自ContentControlTextedStackPanel派生自StackPanel,其中包含PortItems。在MainWindow我有2 StackPanels,其中包含TextedStackPanels。在PortItem我已经覆盖了MouseLeftButtonDown方法。但是,当我这样做时,这种方法不会被解雇。我在论坛中搜索过,发现Background的{​​{1}}属性必须设置为透明。我申请了这个,但没有变化。该怎么办 ?

编辑1 我使用部分课程。我有两个课程:Grid/StackPanelPortItem.cs。我修改了这个XAML文件中的任何视觉变化。

编辑2 此外,任何鼠标事件都不会被触发。当我将鼠标放在PortItem.cs.xaml

上时,我使用IsMouseOver的触发器也不起作用

XAML

PortItem

2 个答案:

答案 0 :(得分:0)

编辑:根据您对代码所做的更改,尝试将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创建了模板?我创建了跟随类来复制你的PortItem和base.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>

你提到的背景是透明的你可以在边框控件中看到,如果你把背景留下来是正确的,那么事件永远不会发生。

答案 1 :(得分:0)

确保您没有在PortItem上将“IsHitTestVisible”设置为false。此外,请确保其上没有其他控件。如果是,则将其“IsHitTestVisible”属性设置为false,然后您的PortItem控件将获得鼠标右键单击事件。要确保没有任何内容在顶部,请声明将您的PortItem作为添加到TextedStackPanel的最后一项内容。要仔细检查顶部没有其他内容,请将其他控件的背景颜色更改为非常明显的(仅用于测试)以查看是否有任何内容覆盖您的PortItem控件。此外,更改PortItem控件上的颜色以验证它是否真的在您认为的位置。然后,一旦你完成所有工作,将颜色改回原来的颜色。

如果您可以提供XAML的代码示例,那可能会有所帮助。如果您在代码中动态添加PortItems,也请提供该代码。