Atualizando um aplicativo WinForms para WPF
-
19-08-2019 - |
Pergunta
Eu tenho um projeto paralelo que eu escrevi há alguns anos atrás em WinForms. Para melhor ajudar-me a aprender WPF, eu gostaria de reescrevê-lo em WPF. Idealmente, eu gostaria de simplesmente modificar o projeto atual que eu tenho e reescrever a interface do usuário no WPF em vez de criar um novo projeto.
Eu estou tendo alguns problemas ao fazer isso. Eu fiz o seguinte (usando o Visual Studio 2008 SP1):
- Mudou o quadro alvo entre 2,0 e 3,5. referências
- Adicionado PresentationCore, PresentationFramework e WindowsBase.
Neste ponto, notei que algo estava errado. Quando eu cliquei direito do projeto e selecionado Add | New Item, eu não tenho uma opção para criar uma janela WPF - a única classe WPF que eu poderia criar um WPF User Control. Desde que eu tinha alguns outros projetos WPF ao redor, eu copiei App.xaml. * E Window1.xaml. * Desse projeto ao meu, e atualizado-los quando necessário (basicamente apenas mudando o namespace desse projeto para o namespace do meu projeto).
Eu, então, eliminado Program.cs (que continha anteriormente o método principal, que exibia o principal WinForm Form), e construiu o projeto. Eu tenho um erro indicando que não existe um método principal.
Parece que internamente Visual Studio sabe que este projeto é realmente um aplicativo WinForms, e não um aplicativo WPF. Num projecto WPF (criado seleccionando "Aplicação WPF"), nas propriedades de aplicação que pode definir o exemplo da classe de aplicações como um objecto de arranque. Em meus WinForms convertido projeto, que não é uma opção.
Eu levei um rápido olhar para o arquivo csproj num editor de texto, mas não consegui encontrar nada que possa dizer Visual Studio que o projeto é realmente WinForms em vez de WPF.
O que mais eu preciso fazer para transformar meus WinForms projetar em um projeto "real" WPF? Eu tenho uma opção diferente de criar um novo projeto e apenas substituindo o meu projeto atual?
Update: eu dei uma olhada mais de perto os arquivos csproj, e notei que App.xaml foi adicionado como uma página:
<Page Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
No entanto, no meu outro projeto WPF, é uma ApplicationDefinition. Depois que eu mudei isso, eu poderia definir o meu exemplo de aplicação como o start up objeto, e meu aplicativo seria executado. Eu ainda não tenho uma opção para criar quaisquer outros do que controles de usuário tipos WPF, no entanto.
Solução
Eu não sei para certeza o que nos informa arquivo de projeto do Visual Studio que tipo de projeto está sendo usado, mas meu palpite é que os "ProjectTypeGuids" é fundamental.
projectos Meu WPF tenho este:
<ProjectTypeGuids>
{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};
{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
</ProjectTypeGuids>
Aqui está um link eu achei que descreve os guids e que tipo de projeto que eles representam. Você notará que a partida guid com "60DC" corresponde a lista na ligação para aplicações WPF.
Outras dicas
A resposta de Sailing Judo trabalhou para me converter um WinForms projetar em um WPF, mas não descreveu em detalhes o que é necessário;
- Abra o arquivo
csproj
para o projeto que você deseja converter. - Procure o
<ProjectTypeGuids>
string -. Mais likly não existirá -
Adicione a seguinte dentro da tag do arquivo de projeto. Se você tem várias tags
PropertyGroup
, use o um sem um atributoCondition
(por exemplo, as propriedades padrão).<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-
Save -. Se você tiver o projeto aberto VS irá pedir para recarregar o projeto
Pelo que vejo e teste, agora eu posso facilmente adicionar WPF do Windows e WinForms. Meus WinForms mais velhos também funcionam sem problemas.
Infelizmente não.
WPF e Windows projectos formas não são muito compatíveis.
- Tente extrair o máximo de pieguice código de lógica em uma biblioteca de classes
- Criar uma nova solução em branco
- Adicionar um novo projeto WPF à solução
- Adicione o projeto de biblioteca de classe para o solução
- Definir a biblioteca de classes como uma dependência o projeto WPF
- Recriar as janelas WPF
Espero que isso funciona para você.
Boa sorte com este esforço!