Melhor abordagem para desenvolver a aplicação WPF [closed]

9

Gostaria de criar um aplicativo do WPF e gostaria de receber alguns conselhos sobre a abordagem mais apropriada.

Eu quero criar um leitor de RSS que atualize automaticamente quando uma nova entrada de RSS é adicionada. O problema é que eu não quero usar controles tradicionais (listbox / listview) para exibir os dados. Eu gostaria que os itens de feed aparecessem em painéis aleatoriamente na tela. Esses painéis consistem em vários blocos de texto. Cada painel exibe um item de feed.

Seria algo parecido com isto: Conceito

Isso levanta várias questões:

1: gerar painéis completamente a partir do código ou usar um controle personalizado?

Eu modelaria uma classe como um painel, conforme descrito acima. Essa classe adiciona manualmente todos os controles ao formulário e solta o painel em um local aleatório no formulário. Quando uma nova entrada de RSS é adicionada, uma instância dessa classe é instanciada e passa as informações de rss como parâmetros.

Por outro lado, pode ser melhor criar um UserControl para isso. É fácil criar este UserControl pelo código e passar os parâmetros no construtor?

2: Os meus dados / painel podem ser atualizados automaticamente quando uma nova entrada RSS é adicionada on-line?

Agora eu atualizaria tudo a cada (x) segundos e verificaria uma coleção de painéis se tivesse que criar um novo. Nesse caso, crie um novo painel e solte-o aleatoriamente no formulário.

Existe uma maneira melhor de fazer isso? Eu posso usar um local ObservableCollection com ligação de dados que atualiza automaticamente um controle (caixa de listagem, etc) quando a coleção muda, isso também pode ser feito com uma fonte online como um feed RSS?

A maneira mais ideal é que meu aplicativo seja notificado quando uma nova entrada RSS for adicionada, faça o download da última entrada e crie um novo Painel (através de código ou através de um UserControl)

Se isso for difícil de realizar, usarei o método de atualização tradicional.

3: Preciso usar DependencyObject / DependencyProperty?

Eu sei DependencyObject & amp; DependencyProperty expõe algumas funcionalidades poderosas para UserControls , mas eu realmente não sei como usá-las. Eles são necessários para este tipo de aplicação?

4: Preciso usar o WCF (Windows Communication Foundation)?

Eu não sou realmente experiente com coisas "avançadas" do WPF, como conexões de dados avançadas, DependencyObjects e UserControls, mas eu adoro aprender!

    
por Nick 08.07.2011 в 19:46
fonte

4 respostas

2

Eu recomendaria primeiramente investigar o uso do padrão de design MVVM e usar uma estrutura MVVM. Em segundo lugar, você poderia conseguir esse efeito usando um ItemsControl e usar um Canvas como seu tipo ItemsPanel, então você poderia usar um ItemTemplate personalizado que renderiza cada objeto de dados usando um UserControl.

O controle de usuário teria uma propriedade de dependência, que é o item de dados, e você ligaria isso na declaração do modelo de item.

Você poderia ter um modelo que modela cada entrada RSS (RSSEntry) e talvez um RSSEntryViewModel que adiciona as coordenadas x e y na tela.

Seu modelo de visualização de tela teria uma ObservableCollection de RSSViewModel que você adicionaria / excluiria etc. e a interface do usuário seria atualizada automaticamente.

Você não precisaria de uma camada de serviço se não quisesse, mas contanto que seu modelo de visualização recupere as entradas por meio de uma abstração, deve ser fácil refatorar no futuro.

    
por devdigital 08.07.2011 / 20:07
fonte
2
  1. Gerar painéis completamente a partir do código ou usar um controle personalizado? Eu geralmente tento fazer o máximo possível no XAML declarativamente, separar lógica e apresentação geralmente ajuda a escalabilidade do aplicativo e qualidade do código - mas é claro que existem limites. UserControl s geralmente não devem ter parâmetros em seus construtores (não que eles não possam tê-los, mas você precisa ter um construtor sem parâmetros para que a classe possa ser instanciada a partir do XAML).

  2. Meus dados / painel podem ser atualizados automaticamente quando uma nova entrada RSS for adicionada online? Deve haver algo para enviar notificações de atualização para a camada WPF, para que ela possa atualizar a exibição . No caso de um aplicativo RSS, eu acho que você terá que manualmente verificar periodicamente os canais RSS para atualizações (RSS é uma tecnologia pull ) e, em caso de atualização, adicione o item no ObservableCollection , que enviará a notificação de atualização apropriada para você.

  3. Eu tenho que usar DependencyObject / DependencyProperty? Não, você pode usar INotifyPropertyChanged . As DependencyProperties são geralmente usadas em propriedades que servirão como destino de ligação (a propriedade que está declarando a ligação) ou em propriedades que aproveitarão qualquer outra herança ou animação de valor de recurso do DP. INotifyPropertyChanged é suficiente para as propriedades associadas (que são nomeadas na expressão de ligação). Observe que você pode usar NotifyPropertyWeaver para gerar as notificações para INotifyPropertyChanged automaticamente - basta criar o método OnPropetyChanged e o tecelão chamará sempre que qualquer propriedade do objeto é alterada! E ainda se integra lindamente com o Visual Studio.

  4. Eu tenho que usar o WCF (Windows Communication Foundation)? Para o WCF você precisa ter algo para se comunicar - afinal, é um framework de comunicação. Você?

por Matěj Zábský 08.07.2011 / 20:12
fonte
1
  1. Você deve usar um listview do WPF (ou similar; não tem certeza de qual controle exatamente) e definir o tema para corresponder à sua idéia de "painel" desejada. Essa é uma das grandes forças do WPF. Então, você obtém todos os benefícios do controle integrado, com qualquer aparência desejada.

  2. Vincular ao ObservableCollection ; como você atualiza essa coleção observável é o seu negócio. Eu não acho que o RSS tenha uma parte das "notificações push" de suas especificações, então a pesquisa é como essas coisas geralmente são feitas. Mas no final isso não importa realmente; essa parte do seu código é completamente separada do WPF, então, desde que atualize o ObservableCollection , você é bom.

  3. O DependencyObject / DependencyProperty ou INotifyPropertyChanged é geralmente necessário para qualquer tipo de aplicativo WPF com ligação de dados. Vale a pena aprendê-las e, talvez, aprender um quadro que as abstraia para você.

  4. Não; O WCF não tem nada a ver com o WPF. Você pode usar qualquer tecnologia para conversar com o servidor que você gosta.

por Domenic 08.07.2011 / 20:05
fonte
0
  

1: gerar painéis completamente a partir do código ou usar um controle personalizado?

Crie duas classes de modelo de vista. Uma turma modelará a exibição de todos os seus itens e um deles representará o conteúdo de um único item. O primeiro conterá uma coleção observável do segundo.

Crie um controle de usuário para exibir cada um.

A exibição de contêiner será um ItemsControl cujo ItemsSource está vinculado à sua coleção de modelos de exibição de item, cujo ItemsPanel é Canvas e cujo ItemContainerStyle associa Canvas.Top e Canvas.Left às propriedades Top e Left nos modelos de exibição de item. Quando um novo item é adicionado à coleção do modelo de visualização, a ligação criará automaticamente um novo painel para ele.

Os modelos de visão de item geram os valores aleatórios de Top e Left . (Você também pode solicitar que eles solicitem os valores do container quando forem construídos.)

(Se o termo "view model" não significa nada para você, você precisa pesquisar o modelo / modelo view / view, também conhecido como MVVM.)

  

2: Os meus dados / painel podem ser atualizados automaticamente quando uma nova entrada RSS é adicionada on-line?

Primeiro, você precisa pesquisar como os agregadores de RSS funcionam, desde que você está escrevendo um. Isso explicará a mecânica de obter atualizações de feeds RSS. Esse problema é completamente distinto do problema de apresentar as atualizações assim que você as obtiver.

Sua camada de agregação de RSS verificará feeds, procurará novos itens e, quando encontrar novos itens, criará um evento. Sua camada de interface do usuário manipulará os eventos gerados pela camada de agregação e criará novos objetos do modelo de exibição para cada novo item recebido.

Esse uso de eventos separa completamente os dois componentes um do outro. Por exemplo, você pode testar sua interface do usuário criando um agregador simulado que gera mensagens de teste e fazendo com que sua interface de usuário a ouça em vez de seu agregador real. Da mesma forma, você pode testar seu agregador sem criar o - você pode simplesmente criar um ouvinte que registra seus eventos e despeja itens no console.

  

3: Preciso usar DependencyObject / DependencyProperty?

Você provavelmente não precisará implementar o seu próprio, não.

  

4: Preciso usar o WCF (Windows Communication Foundation)?

Por que você não faria isso?

    
por Robert Rossney 08.07.2011 / 20:08
fonte