Pergunta

Atualmente, estou esperando para usar um PropertyGrid para permitir aos usuários editar algumas das minhas aulas, no entanto eu bater em uma parede com o passar objetos para o UITypeEditor (s) que eles usam. Quando o usuário pressiona o drop down Quero mostrar uma lista de texturas já carregados para escolher, se quiser usar uma textura a aplicação não foi carregado ainda assim eles podem clicar em um botão para escolher um de um diálogo de arquivo. No caso de eu não fazem sentido aqui uma simulação da forma:

Imagem suspensa.

Meu problema:. Para preencher a caixa de listagem que necessitem de acesso à classe que gerencia a lista de recursos do UITypeEditor

Agora eu já resolveu este problema para minhas próprias classes, dando-lhes uma referência na criação ao seu objeto de gestão. No UITypeEditor Eu, então, usar essa referência para o acesso que eu preciso. No entanto, eu não posso fazer isso para as classes I não escritos, tais como a classe XNA Texture2D.

Aqui está o que as classes que estou usando algo como:

class StaticGeometryChunk
{
    // Geometry data to draw with. Contains a reference to its managing 
    // class for use in its UITypeEditor.
    public GeometryData { get; set; }
    ....
}

class Material
{
    // These are XNA classes. I can't just add a reference to its managing 
    // class (I think?).
    public Texture2D Texture1 { get; set; }
    public Texture2D Texture2 { get; set; }
    ....
}

Eu estive olhando para minhas opções e eles parecem ser:

  1. Faça as classes estática de gestão.

Eu realmente não quero fazer isso. Existem várias classes gerenciar como cada recurso é carregado de forma diferente. Há também aulas que precisam ser criadas antes de estes e são passados ??em.

  1. Faça as classes dirigentes singletons.

Eu realmente não quero fazer isso também. Parece uma maneira rápida e suja para "esconder" o problema em vez de "resolver"-lo. Eu também pode querer a opção de ter várias classes de gestão no futuro, que os singletons eliminar.

  1. Criar uma classe de invólucro que detém a referência a uma classe gestão e seu alvo (como o XNA Texture2D).

Este é atualmente o que eu estou pensando em fazer. Sua seria bastante simples e rápido de fazer, mas algo sobre isso me aborrece, mas eu não sei o que.

Todos os pensamentos sobre o acima ou outros métodos para passar o que eu preciso para o UITypeEditor?

Obrigado pela leitura.

Foi útil?

Solução

No método editValue, você é dado um contexto. Use context.Instance para acessar o objeto que mantém sua propriedade. Este objeto deve conter também uma propriedade que lhe dá acesso à lista de coisas que você deseja exibir. Você pode testar se context.Instance é ITextureProvider por exemplo, em seguida, lançá-lo e acesso as texturas. Não sei se isso faz sentido em seu design, mas deixe-me saber.

Outras dicas

Como alternativa, você pode tentar a seguinte abordagem. Acho que é muito elegante, porque ele não requer para armazenar uma lista de valores de propriedades disponíveis no objeto. Portanto, por exemplo, você pode mostrar um conjunto de valores em uma forma e outro conjunto em outro.

  1. Criar um IYourDataProviderService interface.
  2. Criar uma implementação de IYourDataProviderService, que conhece os dados concretos para fornecer.
  3. Crie uma classe que implementa ISite. Em GetService () método retornar uma instância da classe que implementa IYourDataProviderService, se o parâmetro é serviceType typeof (IYourDataProviderService). Deixei resto de métodos ISite jogando NotImplementedException (exceto propriedade DesignMode) e para mim funcionou, mas provavelmente isso não é uma solução ideal.
  4. 'Load' manipulador No evento atribuir a sua implementação para a propriedade do site de sua PropertyGrid.
  5. Aproveite!
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top