Pergunta
Eu preciso implementar um Canvas
que dimensiona o seu conteúdo de acordo com o seu tamanho. Eu sei que há Viewbox
, que dimensiona tudo dentro dele. No entanto eu não posso usar isso, porque alguns elementos têm um tamanho fixo e não pode ser escalado.
Também como pode ligar-se o tamanho do Canvas
para o elemento pai (por exemplo uma janela redimensionável). Há SizeToContent para janelas, eu quero o tamanho encaixe exatamente o contrário. Além disso, a tela usa algum desenho com base no tamanho do elemento de hospedagem, como é redesenho desencadeada e como posso garantir que ele só chama se ele fica um tamanho válido (ou minutos)?
Solução
Se você não especificar qualquer largura ou altura para a tela que usa automaticamente todo o espaço disponível. Isso ocorre porque o VerticalAlignment
padrão e HorizontalAlignment
estão definidas para Stretch
.
O que você quer dizer com tela que balança o seu conteúdo de acordo com tamanho, de sem escala todo o conteúdo como alguns têm tamanho fixo?
Update após comentários
Se o seu algoritmo de desenho já dimensiona o conteúdo para a tela altura e largura, em seguida, tudo que você precisa fazer é redimensionar a tela para caber na área que acredito? Nesse caso, basta remover a altura / largura valores codificados e a tela será redimensionada para caber no recipiente.
Você pode precisar usar ActualHeight / ActualWidth em vez de altura / largura no algoritmo de desenho após este embora. ActualHeight / ActualWidth devolver os valores que o contêiner de layout dará sua tela assim que estes representam os valores da tela é desenhada com.
Outras dicas
Eu acho que você pode encontrar as respostas a todas suas perguntas na minha London Underground demonstração .
Estou fazendo isso a partir da memória, mas se bem me lembro uma janela usa o um painel ou uma tela como parte dela de ControlTemplate (no qual reside o ContentPresenter), o que significa que uma lona colocados diretamente em uma janela terá questões redimensionando automaticamente como se pode em outros lugares. Existem algumas maneiras básicas para lidar com isso.
1 Escrever um novo ControlTemplate para a sua janela para o uso. :(
2 Coloque o conteúdo diretamente na janela, em vez de uma tela dentro da janela:. / Tablet
3 Faça um by-name vinculativo. :)
<MyWindow x:Name="topWindow">
<Canvas x:Name="topCanvas" Width="{Binding ElementName=topWindow, Path=ActualWidth}" Height="{Binding ElementName=topWindow, Path=ActualHeight}">
...Content...
</Canvas>
</MyWindow>
(Quando isso acontece, eu grades muitas vezes ligam dentro Telas desta forma, para que eu possa itens facilmente animados movendo-se de uma posição de grade para outro.)