El evento MouseLeftButtonDown no se activa en el ContentControl secundario

He PortItem que derivó de ContentControl, TextedStackPanel derivado de StackPanel que contiene PortItems. Y en MainWindow Tengo 2 StackPanels que contiene TextedStackPanels . En PortItem he anulado MouseLeftButtonDown método. Pero cuando hago esto en este método no se dispara. He buscado aquí en el foro y he encontrado que Background propiedad de Grid/StackPanel debe establecerse en Transparente. Apliqué esto, pero no hay cambios. Qué hacer ?

EDIT 1 Yo uso clases parciales. tengo 2 clases: PortItem.cs y PortItem.cs.xaml. Modifico cualquier cambio visual en este archivo XAML.

EDIT 2 Además, los eventos del mouse no se disparan. Los disparadores que uso IsMouseOver tampoco funcionan cuando mantengo el mouse encendido PortItem

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>

preguntado el 12 de junio de 12 a las 14:06

Entonces, ¿es el área transparente alrededor de su control en la que se supone que debe hacer clic? intente agregar ClipToBounds="False" a la cuadrícula solo para asegurarse de que el rectángulo no se recorte a sus límites. -

sí, puse el fondo de todos los paneles/cuadrículas en transparente. pero no funciona de todos modos. Voy a comprobar lo que dices arriba -

2 Respuestas

Asegúrese de no haber establecido 'IsHitTestVisible' en falso en su PortItem. Además, asegúrese de que no haya otros controles encima. Si lo son, establezca su propiedad 'IsHitTestVisible' en falso y luego su control PortItem obtendrá el evento de clic derecho del mouse. Para asegurarse de que no haya nada en la parte superior, declare su PortItem como lo último que se agregó a su TextedStackPanel. Para verificar que no haya nada más encima, cambie el color de fondo de otros controles a algo realmente notable (solo para probar) para ver si algo está cubriendo su control PortItem. Además, cambie el color en su control PortItem para verificar que realmente está donde cree que está. Luego, una vez que todo funcione, cambie los colores a sus colores originales.

Si pudiera darnos una muestra de código de su XAML, eso podría ayudar. Si está agregando PortItems dinámicamente en el código subyacente, proporcione ese código también.

Respondido el 12 de junio de 12 a las 14:06

Editar: a la luz de los cambios que ha realizado en su código, intente agregar ClipToBounds="False" en la parte superior de su declaración de control de usuario.

<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" >

¿Ha creado una plantilla para su PortItem? Creé la clase de seguimiento para replicar su PortItem y el punto de interrupción en la línea base.OnMouseButtonDown y se dispara, creo que la razón por la que su método no se ejecuta es porque no hay ningún elemento visual con el que el mouse realmente interactúe, intente agregar el estilo a continuación a su aplicación y debería ver que el método se activa correctamente.

   public class PortItem: ContentControl
    {
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {

            base.OnMouseLeftButtonDown(e);
        }
    }

luego en XAML creé un estilo para darle algo para representar.

 <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>

El fondo transparente que mencionas lo puedes ver en el control de fronteras, si dejas el fondo fuera estás en lo correcto, el evento nunca se activa.

Respondido el 12 de junio de 12 a las 14:06

no ayudó tienen una estructura difícil. Grids, StackPanels en él y también otros paneles. Y por fin es ContentControl al que le di XAML. ¿Alguna otra solución? - Rabi

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.