2012-02-01 4 views
5

It appears que el número máximo de adorners que funcionan sin ninguna rotura es 144.uso de más de 144 adorners

Tengo un ScrollView con un montón de objetos, y muchos de ellos vienen con adorners. Los primeros 144 adornos están colocados correctamente, pero el resto no. Tenga en cuenta que es una situación excepcional cuando hay tantos; generalmente hay exactamente cero adornos. Sin embargo, me gustaría que esto funcione correctamente incluso en esa ocasión excepcional.

Dejando de lado cómo este límite arbitrario (y muy bajo) me hace sentir, ¿hay alguna solución práctica para este error?

+0

Si las posiciones del adorno están animadas, la pregunta puede estar relacionada con [esta pregunta] (http://stackoverflow.com/questions/9049610/is-141-the-maximum-number-of-wpf-panel-items -que-puede-animarse-simultáneamente/9062419 # 9062419). Noté 144 como el número máximo de transformaciones animadas (bajo ciertas condiciones) allí. – Clemens

+0

También hay [esta pregunta] (http://stackoverflow.com/questions/7610608/onrender-method-does-not-work-with-more-than-144-controls) que también se ejecuta en el número mágico 144.Los míos no están animados directamente, pero están unidos a controles que se desplazan hacia adelante y hacia atrás. –

Respuesta

3

En este momento no hay forma conocida de hacerlo.

Lo cual está igual de bien, porque el rendimiento me pareció pobre; simplemente subclasificando mi control de Imagen que se suponía que mostraría el adorner, y dibujando la superposición en el OnRender, funcionó mucho mejor (y a diferencia de WinForms, el visual puede extenderse más allá del límite lógico del control).

0

Esto podría ser muy tarde para la fiesta aquí, pero esto pareció resolver el problema para mí. Conservé una lista de los adornos que había agregado a la capa de adorno (llamados m_adorners), y en el control de raíz donde estaban contenidos mis adornos, me conecté al evento LayoutUpdated. Aquí es controlador de eventos:

private void OnLayoutUpdated(object sender, EventArgs e) 
    { 
     if (m_adorners.Any(a => !a.IsArrangeValid && 
       a.Parent != null)) 
     { 
      AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this); 
      adornerLayer.InvalidateArrange(); 
     } 
    } 
2

aquí es el escenario en el que he conseguido poner en práctica un entrenamiento para este problema:

tengo una serie de cuadros de texto que están vinculadas a un documento de Excel. Los cuadros de texto toman un valor numérico. Están configurados para invalidar los errores de datos en el código xaml. Se produce un error de datos si el número es < 1 o nulo. Coloqué un AdornerDecorator alrededor del cuadro de texto (para que el borde rojo de invalidación aparezca correctamente sobre el cuadro de texto). En Excel, puede modificar todos los cuadros de texto al mismo tiempo, pero, como encontró el OP, si logra invalidar más de 144 cuadros de texto a la vez, el decorador de adorno comienza a reproducirse, compensando la posición de los bordes (el mismo Lo que fue diseñado para solucionar en primer lugar).

Probé una serie de soluciones diferentes, incluida la invalidación del diseño, sin embargo, ninguno de estos funcionó para la situación que estaba enfrentando. Usando Snoop, encontré que si actualicé manualmente el cuadro de texto, el adorner se colocó correctamente. Entonces, decidí llamar a una actualización del diseño de cada cuadro de texto individual que necesitaba el adorno. Hice esto al escuchar OnValueUpdated en los cuadros de texto. Si el nuevo valor que estaba actualizando pasó a ser un valor no válido, forzaré un "UpdateLayout()" para el cuadro de texto (solo quería hacer esto para los valores no válidos ya que forzar una actualización afecta el rendimiento, y no quiero hazlo cada vez que cambie el valor).

De esta forma, independientemente del número de celdas que quería cambiar a la vez, decoder decorator siempre se muestra en la posición correcta (excepto el último cuadro de texto para evaluar que, a pesar de mis mejores esfuerzos, siempre muy ligeramente desalineado).

Cuestiones relacionadas