2012-08-27 8 views
9

Tengo un mensaje que está dentro de un borde y se muestra delante de un área de cliente MDI. Como es solo un mensaje, configuro IsHitTestVisible como falso. Para su comodidad, también incluí un botón dentro de él para que el usuario simplemente haga clic en el botón para comenzar un nuevo diagrama.¿Cómo se puede establecer IsHitTestVisible en True en un elemento secundario de algo donde se establece en falso?

Sin embargo, como el borde tiene su IsHitTestVisible establecido en False, corta el valor del botón True para que el usuario no pueda hacer clic en el botón.

Dicho esto, ¿cómo puede hacer que un control sea invisible para el mouse, al tiempo que permite que uno de sus hijos reciba eventos del mouse?

Aquí hay una captura de pantalla:

enter image description here

Queremos que el área azul con el texto a ser invisibles prueba afectadas, pero queremos que el botón para seguir siendo capaz de ser presionado. ¿Pensamientos? (Y sí, ya sé de apilar los dos elementos en una cuadrícula, sino que se mete con el diseño.

+1

Creo que tendrás más suerte averiguando cómo arreglar tu diseño usando un 'Grid' con dos controles apilados el uno del otro que el que encontrarás en la forma de establecer' IsHitTestVisible = true', pero permite las pruebas de golpe de todos modos un artículo infantil. ¿Qué tipo de diseño tienes? – Rachel

+0

Puede anular HitTestCore ... para determinar el comportamiento de golpe con su UIElement (suponiendo que haya creado un UserControl) ...... pero, como dice Rachel ... use Grid o diferente diseño. –

+0

Sí, ya tengo un control mucho más liviano llamado LayerPanel que simplemente apila elementos uno encima del otro. Corta todas las medidas y demás de la Grilla, que es notoriamente pobre en rendimiento. Aún así, odio tener que poner capas, porque cuando el texto cambia para la localización, empuja el diseño y ahora tienes que preocuparte de alinear algo en frente de algo que no está conectado. No es divertido. Factible, pero no divertido. – MarqueIV

Respuesta

1

Ok, no parece que la pregunta se pueda resolver como se le pidió, y por lo tanto parece que tenemos que volver al método en capas. En ese caso, para compensar los cambios de texto, debe establecer la alineación vertical del botón en Abajo y asegurarse de que haya relleno adicional en el borde inferior del borde o margen inferior en el BloqueArtículo) para garantizar que la etiqueta siempre flote por encima del botón. Usted administra los márgenes laterales/relleno para ambos usando los mismos principios.

Esto nos dará lo que buscamos, pero parece bastante engorroso. Una vez más, me gustaría que hubiese alguna manera de especificar IsHitTestVisible (o IsEnabled para ese asunto) con un 'Force' de alguna manera que los restablezca (y abajo) como el dueño de los comportamientos. Una persona puede soñar. Hasta entonces ... capas es!

+0

En lugar de soñar, puedes ver mi respuesta editada :) – Erez

+0

Eso realmente no responde mi pregunta, y también estás usando IsEnabled que puede, y muchas veces cambia, el aspecto de un control. Además, requiere subclassing, lo que significa que no puede usarlo para los controles existentes. – MarqueIV

1

yo sepa no se puede. puede hacerlo sin embargo, con IsEnabledProperty, y todavía con un poco de solución. usted tiene que crear su propio botón de la siguiente manera:

Editado 09/01/2013:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("hello"); 
    } 
} 

public class MyButton : Button 
{ 
    static MyButton() 
    { 
     IsEnabledProperty.OverrideMetadata(typeof(MyButton), 
     new UIPropertyMetadata(true,(o, args) => { },(o, value) => value)); 
    } 
} 

XAML:

<BorderIsEnabled="False"> 
    <wpfApplication2:MyButton Margin="61,95,88,100" Click="ButtonBase_OnClick">Open a new diagram</wpfApplication2:MyButton> 
</Border> 
+0

Realmente no sigue exactamente lo que está tratando de mostrar aquí. Parece que definió los delegados anónimos PropertyChanged y Coercion, pero ambos solo hacen el comportamiento predeterminado, entonces, ¿por qué especificarlos? Y para el caso, estableces el valor predeterminado en True, que ya es el predeterminado para IsEnabled, lo que nos lleva a preguntarnos por qué anulas los metadatos en primer lugar.Una vez más, realmente no sigues lo que estás tratando de lograr con esto ya que efectivamente parece no cambiar nada. – MarqueIV

+0

El comportamiento predeterminado de IsEnabledProperty es poner en cascada su valor desde el contenedor a sus hijos, una vez que sobrescribe y establece en el elemento primario IsEnabled = False no afectará al elemento secundario. – Erez

+0

Um ... pero ¿no podrías simplemente configurar IsEnabled en el niño en True sin tener que subclasificar nada? Me refiero a si, como dijiste, el comportamiento predeterminado de IsEnabled debe ser heredado por sus hijos, entonces todo lo que debes hacer es establecer IsEnabled en el hijo directamente, sin la subclase, ¿no? – MarqueIV

Cuestiones relacionadas