2009-02-16 12 views
7

Estoy portando una aplicación WPF a Silverlight 2, y he encontrado varias características WPF que actualmente faltan en SL. ¿Alguien podría ayudarme con equivalentes o sugerir soluciones alternativas?Solución alternativa para algunas características WPF que faltan en Silverlight

  1. Deseo gestionar los clics y los clics dobles en un cuadro de texto incrustado en un cuadro de lista. La implementación de WPF usa PreviewMouseLeftButtonDown/Up en un control de cuadro de lista. Como puede hacerse esto en Silverlight, parece que PreviewMouseLeftButtonDown/Up falta en Silverlight.

  2. Deseo controlar las pulsaciones de los botones (F2/Eliminar) en un cuadro de texto incrustado en un cuadro de lista. La implementación de WPF usa PreviewKeyDown en un control de cuadro de texto que se incrusta como un elemento en un cuadro de lista. Parece que PreviewKeyDown falta en Silverlight. El controlador de eventos KeyDown parece no ser invocado.

  3. Quiero cambiar algunas propiedades de apariencia de un cuadro de texto dependiendo del valor de algunas propiedades adjuntas personalizadas. La implementación de WPF usa DataTrigger para hacer esto. ¿Cómo puede hacerse esto en Silverlight? Parece que DataTriggers faltan en Silverlight.

  4. Quiero cambiar el ancho de un cuadro de texto dependiendo del ancho real del cuadro de lista en el que se encuentra el cuadro de texto. La implementación de WPF utiliza el enlace RelativeSource. ¿Cuál es el equivalente de Silverlight o solución para esto?

+0

¿Votarás las respuestas que consideres más útiles? – BenMaddox

Respuesta

0

Para los ítems 1 y 2, la mejor forma de obtener acceso a estos eventos de entrada es crear un TextBox personalizado derivado del TextBox incorporado. Luego puede anular OnKeyDown y OnMouseLeftButton hacia abajo. Desde allí, puede llamar al código necesario o iniciar un nuevo evento. por ejemplo:

public class MyTextBox : TextBox 
{ 
    public event MouseButtonEventHandler MySpecialMouseLeftButtonDown; 

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     if (MySpecialMouseLeftButtonDown != null) 
     { 
      MySpecialMouseLeftButtonDown(this, e); 
     } 
     base.OnMouseLeftButtonDown(e); 
    } 
} 

De forma similar con OnKeyDown.

+0

No es así como funcionan los eventos de vista previa en WPF. Como WPF ha enrutado eventos, los eventos de vista previa se tunelizan desde el elemento raíz (por ejemplo, Ventana) hasta el receptor final (por ejemplo, Cuadro de texto) que brinda a los elementos superiores la opción de interceptar el evento antes de que llegue al cuadro de texto. –

+0

Sí. Llamar al evento PreviewMouseLeftButtonDown no fue una buena idea. Pero funcionaría resolver el problema que tenía el iniciador de subprocesos. Editaré la respuesta para eliminar la fuente de posible confusión. – KeithMahoney

+0

Esto también me ha ayudado, +1. –

0

Estoy más familiarizado con Silverlight que con el WPF completo. Por favor considier mis respuestas en consecuencia.

Para el número 2. Para muchas teclas, compruebo KeyUp y KeyDown. Uso KeyDown mientras trato de ver todo el tiempo que la tecla se mantiene presionada y KeyUp cuando se usó solo una vez. Debes saber que esto fue para un juego sin un cuadro de texto individual.

0

Para el elemento 4, puede vincular tanto el ancho del cuadro de lista como el ancho del cuadro de texto a la propiedad de un recurso estático para que actúe como un enrutador para el enlace. También puede usar un value converter que inicialice con una referencia al cuadro de lista, luego use el convertidor para su ancho de cuadro de texto.

Para el artículo 3, podría utilizar un enfoque similar.

Cuestiones relacionadas