Pergunta

Estou tendo problemas para entender quando o OnRender método é invocado.Considero o meu exemplo:Eu tenho uma classe SomeElement decorrentes de FrameworkElement que substitui o método OnRender.Suponha que eu tenha uma Grid grid.O que eu seria de esperar é que

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

faria com que o SomeElement.OnRender método para ser acionado.Não no meu caso, mas o seguinte:

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

Então a minha pergunta é por que someElement não é desenhada quando é adicionado exclusivamente para a árvore visual.Qual é a importância de adicionar a propriedade Children?E, mais geralmente, o que como é OnRender chamado?Através da árvore visual, ou Children propriedade, ou?

Foi útil?

Solução

AddVisualChild não está fazendo o que você pode pensar é não.

AddVisualChild está lá apenas para criar um filho-pai, relação entre dois elementos visuais no VisualTree.Nada mais ou menos.VisualTree não render tudo o que está dentro dele.

AddLogicalChild faz o mesmo só que ele cria LogicalTree.LogicalTree é geralmente menor e mais curto do que VisualTree, o que significa que seus mais rápido.

A fim de apoiar plenamente prestação de seus filhos, você precisa ligar para medir o método no-los e organizar o método.Além disso, você precisará alterar o VisualChildrenCount propriedade de seu pai e passar o tamanho certo para cada criança e você precisa colocá-los na posição correcta para que o usuário ser capaz de vê-los.Em seguida, as coisas vão ficar prestados.

Chamando AddVisualChild sozinho e InvalidateVisual não está fazendo nada.

Crianças de coleta, por outro lado, é um UIElementCollection que faz todas as coisas que eu mencionei acima automaticamente.É por isso que trabalho com Crianças.Adicionar(...).

Além disso, você deve sempre trabalhar com Crianças de coleta em vez de escrever suas próprias coisas.

Como HighCore mencionados muitos problemas pode ser resolvido por, simplesmente, ter um bom MVVM.

Talvez você não precisa ter um controle personalizado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top