Pergunta

Estou desenvolvendo um controle de mapa na WPF com C #. Eu estou usando um controle da lona por exemplo 400 x 200, que é atribuído um mapa da área de e.g. 2.000 m x 1.000 m.

A escala do mapa seria:. canvas_size_in_meters / real_size_in_meters

Eu quero encontrar os canvas_size_in_meters.

O canvas.ActualWidth dá a largura em de DIU (Dispositivo independente unidades). Assim, 400 DIU de é 400/96 = 4,17 polegadas, DESDE que o física resolução do meu monitor é de 96 dpi.

No entanto, usando uma régua, descobri que a resolução física do meu monitor é de 87 dpi. (Existem apenas alguns monitores que realmente tem 96 dpi física)

Isso DPI diferença (10%) se traduz em uma diferença + 10% na largura de controle mapa real na tela.

Como faço para medir o tamanho de um controle WPF em polegadas exatamente e independentemente da resolução da tela e configuração de DPI?

Foi útil?

Solução

Como faço para medir o tamanho de um controle WPF em polegadas exatamente e independentemente da resolução da tela e configuração de DPI?

Esta não é realmente possível, porque para que ele funcione, WPF teria que saber a resolução (em termos de DPI) do seu monitor. Parece bom em teoria, mas na prática janelas não sabe esta informação. É por isso que próprio Windows assume sempre 96dpi cegamente em vez de ser mais esperto sobre isso.

Mesmo que houvesse alguma maneira de contá-la manualmente, ou se o seu monitor em particular tem um driver personalizado que faz passar a informação correta para janelas, isso não vai funcionar em qualquer outro computador, por isso janelas não passa essa informação para todas as aplicações.

O melhor que você pode fazer é desenhar uma escala como o Google Maps faz. Você sabe que 1 Pixel == 1 milha, assim você pode desenhar uma linha 50 pixels em seu mapa, com uma etiqueta dizendo "esta linha é igual a 50 milhas"

Outras dicas

Não há maneira de calcular tamanho do pixel atual em mm ou polegadas. Como mencionado nos posts anteriores, não é um valor fixo e iria variar dependendo do tamanho atual de resolução e monitor.

Primeiro obtenha a resolução atual. Assumir que é 1280x1024 Agora obter a largura do monitor em mm usando a função GetDeviceCaps. É um padrão do Windows função da biblioteca.

= int widthmm GetDeviceCaps (deviceContext, HORZSIZE); Meu monitor de largura é de 362 milímetros

Assim pixels size = 362/1280 = 0,282 milímetros

A precisão deste método depende da suposição de que a área de exibição abrange a largura do monitor exatamente.

Assim, para responder à pergunta original, o tamanho da tela de 400 x 200 pixels seria (400 * 0,282 / 1000) x (200 * 0,282 / 1000), em metros, quando mostrado no meu monitor.

Obrigado por você resposta rápida.

Eu concordo totalmente, mas eu não queria acreditar em primeiro lugar. Você vê, tem que haver um aproximado cálculo da escala do mapa se o mapa é usado para exibir diferentes camadas de dados mapa (dependente de escala). A maioria das aplicações utilizar um controlo deslizante com e.g. 10 níveis de mapas discretos para definir a "escala".

Ter uma escala absoluta não é crucial para a aplicação, seria bom para mostrar um indicativa escala, como 1: 15.000.

Uma escala absoluta exigiria para uma variável adicional monitorPhysicalDPI (inicialmente definido para 96) que, se os usos optar por alterar daria um pouco melhor dimensionamento (mais uma vez não é fundamental). O tamanho do controle de mapa seria:

map.ActualWidth * (96 / monitorPhysicalDPI) * inchesPerDIU, inchesPerDIU é 1/96

Novamente, essas são cosméticos .. Não seria bom se o Windows sabia dimensões do controle real? (Usuário teria que dar informações sobre as dimensões da tela de configuração do sistema operacional, ou simplesmente instalar o arquivo Monitor INF)

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