Como faço para criar uma página de base no WPF?
Pergunta
Eu decidi que todas as minhas WPF páginas necessário para registrar um evento roteado.Em vez de incluir
public static readonly RoutedEvent MyEvent= EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(BasePage));
em cada página, eu decidi criar uma página de base (chamada BasePage).Eu coloquei a linha de código acima em minha página de base e, em seguida, mudou algumas de minhas outras páginas para derivar a partir de BasePage.Eu não consigo passar essa mensagem de erro:
Erro 12 'CTS.iDocV7.BasePage' não pode ser a raiz de um arquivo XAML porque foi definido usando o XAML.Linha 1 Posição 22.C:\Work\iDoc7\CTS.iDocV7\UI\Quality\QualityControlQueuePage.xaml 1 22 CTS.iDocV7
Alguém sabe a melhor forma de criar uma página de base quando eu posso colocar eventos, propriedades, métodos, etc., que eu quero ser capaz de utilizar a partir de qualquer wpf página?
Solução
Aqui está como eu fiz isso no meu projeto atual.
Primeiro eu tiver definido uma classe (como @Daren, Thomas disse: - apenas uma simples classe C#, não associados arquivo XAML), como este (e sim, isso é uma verdadeira aula - melhor não perguntar):
public class PigFinderPage : Page
{
/* add custom events and properties here */
}
Em seguida, criar uma nova Página e alterar a sua declaração XAML para isso:
<my:PigFinderPage x:Class="Qaf.PigFM.WindowsClient.PenSearchPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:Qaf.PigFM.WindowsClient"
/>
Assim, declaro-o como um PigFinderPage no "meu" espaço de nomes.Qualquer largura de uma página de recursos de que você precisa ter para ser declarado usando uma sintaxe similar:
<my:PigFinderPage.Resources>
<!-- your resources go here -->
</my:PigFinderPage.Resources>
Por fim, mude para o code-behind para esta nova página, e alterar a sua declaração de classe para que deriva de sua classe personalizada em vez de diretamente a partir da Página, como esta:
public partial class EarmarkSearchPage : PigFinderPage
Lembre-se de mantê-lo como uma classe parcial.
Que trabalho um deleite para mim - eu posso definir um grupo de propriedades personalizadas e eventos de volta em "PigFinderPage" e usá-los em todos os descendentes.
Outras dicas
Além disso, ter um olhar para Eventos Anexados e veja se você pode anexar o seu evento para cada Página em seu aplicativo.Pode ser mais fácil do que um costume intermediário classe.
Eu não estou certo sobre isso, mas olhando para o seu erro, gostaria de tentar definir a classe base com apenas c# (.cs) código - não crie um com XAML, apenas um padrão .cs arquivo que estende o WPF Página de classe.
Aqui é um tutorial muito !é muito simples e fácil.
Pequena atualização :Eu apenas tentei fazer isso e não funcionou.Ele é o que eu mudei para resolver o problema:
1.Em muitos fóruns, você vai ler que o sub-páginas deve herdar de uma simples cs classe, sem XAML.Embora ele funciona.Eu herdar de uma normal XAML página sem qualquer problema.
2.Troquei o seguinte código :
<my:PigFinderPage x:Class="Qaf.PigFM.WindowsClient.PenSearchPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:Qaf.PigFM.WindowsClient"
/>
com
<my:PigFinderPage x:Class="Qaf.PigFM.WindowsClient.PenSearchPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="using:Qaf.PigFM.WindowsClient"
/>
porque quando eu tive "clr-namespace" em vez de "com", o Intellisense pode reconhecer PigFinderPage, mas não do compilador.