Pergunta

Tenho um controle que poderíamos identificar como semelhante ao controle ListBox.Cada item é representado por um elemento (exemplo TextBlock).O que eu gostaria é alterar o layout deste item, para que contenha dois TextBlocks.Então eu crio um ControlTemplate, coloco um Border Grid, TwoTextBlocks e está tudo bem.Agora o problema:

Preciso conseguir localizar o texto no item, e fiz isso normalmente assim:

<... Text="{Binding Strings.SomeString, Source={StaticResource ApplicationResources}}" />

Agora preciso fazer o mesmo com os dois TextBlocks.Então pensei que precisava criar um tipo personalizado ao qual esse item seria vinculado e expor duas propriedades:Título e descrição.Se eu expor essas propriedades como tipo string, tudo funcionará bem, mas estou perdendo a ligação de marcação que usei anteriormente.Como conseguir o mesmo com duas propriedades?O resultado deve ser assim:

<... Title="{Binding Strings.SomeString, Source={StaticResource ApplicationResources}}", Description="{Binding Strings.AnotherString, Source={StaticResource ApplicationResources}}" />

Consegui fazer o Localization funcionar com a classe ResourcemManager, mas fica ainda mais complicado para fornecer localização para ser aplicada dinamicamente em tempo de execução.

Então, o que preciso fazer para poder usar o código acima?Então eu só preciso implementar INotifyPropertyChanged em ApplicationResource e tudo está definido.

Foi útil?

Solução

Ótimo!

Vou fazer a mesma coisa que você fez aqui.Sim, tenho uma solução, mas não tenho certeza se funciona até agora.

Primeiro, precisamos de um LocalizationManager que contenha um dicionário.

Por exemplo, se você precisar localizar uma janela de conta de usuário, faça isso

<TextBlock Text="something, UsernameKey">

E o localizationManager mapeará UsernameKey para "Username" ou outro idioma

Segundo, uma extensão xaml que encontra o valor da chave do LocalizationManager.

Gostaria de saber se essa extensão customizada poderia ser derivada da extensão Binding, se sim, isso será muito fácil, basta criar um Binding Object para o alvo.Caso contrário, acho que manter uma referência FRACA ao UIElement por extensão xaml para atualizar dinamicamente o texto é adequado.

Esta solução é simples, mas não genérica.Há algum idioma lido da direita para a esquerda.Ele pede ao aplicativo para mostrar o conteúdo da direita para a esquerda.

Então, tenho outra solução genérica, porém mais complexa.

Em vez da extensão xaml, usamos uma propriedade de dependência de anexação.

Faça isso deste modo:

<TextBlock LocalizationManager.LocalizationKey="UsernameKey" />

Então, o problema agora é como definir a propriedade “Texto” pelo LocalizationManager?

Usamos adaptadores, o LocalizationManager procurará o adaptador adequado para o tipo "TextBlock"

Assim, quando a aplicação estiver inicializando, registramos alguns adaptadores no LocalizationManager:

LocalizationManager.Current.RegisterAdapter<TextBlock>(new TextBlockAdapter())

Esta solução é mais genérica, suporta qualquer tipo de controle se você fornecer adaptador, mas como você pode ver, esta solução precisa de mais trabalho e muito mais complexa que a anterior.

Espero que essas soluções de design possam ajudá-lo ~

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