Pregunta

Tengo problemas para entender cuándo se invoca el método OnRender.Considere mi ejemplo:Tengo una clase SomeElement derivada de FrameworkElement que anula el método OnRender.Supongamos que tengo un Grid grid.Lo que yo esperaría es que

var someElement = new SomeElement();
grid.AddVisualChild(someElement);
someElement.InvalidateVisual();

provocaría que se activara el método SomeElement.OnRender.No es así en mi caso, pero lo siguiente sí:

var someElement = new SomeElement();
grid.Children.Add(new SomeElement());
someElement.InvalidateVisual();

Mi pregunta es, porque someElement no se dibuja cuando se agrega únicamente al árbol visual.¿Cuál es la importancia de agregarlo a la propiedad? Children?Y de manera más general, ¿cómo se llama OnRender?A través del árbol visual, o Children propiedad, o?

¿Fue útil?

Solución

AddVisualChild no está haciendo lo que usted podría pensar que hace.

AddVisualChild solo está ahí para crear una relación padre-hijo entre dos objetos visuales en VisualTree.Nada más ni menos.VisualTree no representa todo lo que hay dentro de él.

AddLogicalChild hace lo mismo simplemente crea LogicalTree.LogicalTree suele ser más pequeño y más corto que VisualTree, lo que significa que es más rápido.

Para admitir completamente la representación de sus hijos, debe llamar al método de medida y al método de organización.Además, debe cambiar la propiedad VisualChildrenCount de su padre y pasar el tamaño correcto a cada niño y debe colocarlos en la posición adecuada para que el usuario pueda verlos.Entonces las cosas se renderizarán.

Llamar a AddVisualChild solo e InvalidateVisual no hace nada.

La colección Children, por otro lado, es una UIElementCollection que hace todas las cosas anteriores que mencioné automáticamente.Por eso funciona con Children.Add(...).

Además, siempre deberías trabajar con la colección Children en lugar de escribir tus propias cosas.

Como mencionó HighCore, muchos problemas se pueden resolver simplemente teniendo un MVVM adecuado.

Quizás no necesites tener un control personalizado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top