Comment créer une page de base dans WPF ?
Question
J'ai décidé que toutes mes pages WPF devaient enregistrer un événement routé.Plutôt que d'inclure
public static readonly RoutedEvent MyEvent= EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(BasePage));
sur chaque page, j'ai décidé de créer une page de base (nommée BasePage).J'ai mis la ligne de code ci-dessus dans ma page de base, puis j'ai modifié quelques-unes de mes autres pages pour qu'elles dérivent de BasePage.Je n'arrive pas à contourner cette erreur :
Erreur 12 'cts.idocv7.basepage' ne peut pas être la racine d'un fichier xaml car il a été défini à l'aide de XAML.Ligne 1 Position 22.C:\Work\iDoc7\CTS.iDocV7\UI\Quality\QualityControlQueuePage.xaml 1 22 CTS.iDocV7
Est-ce que quelqu'un sait comment créer au mieux une page de base lorsque je peux mettre des événements, des propriétés, des méthodes, etc. que je souhaite pouvoir utiliser à partir de n'importe quelle page WPF ?
La solution
Voici comment j'ai procédé dans mon projet actuel.
J'ai d'abord défini une classe (comme l'a dit @Daren Thomas - juste une vieille classe C#, sans fichier XAML associé), comme ceci (et oui, c'est une vraie classe - il vaut mieux ne pas demander) :
public class PigFinderPage : Page
{
/* add custom events and properties here */
}
Ensuite, je crée une nouvelle page et modifie sa déclaration XAML comme suit :
<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"
/>
Je le déclare donc comme PigFinderPage dans l'espace de noms "mon".Toutes les ressources à l'échelle de la page dont vous avez besoin doivent être déclarées en utilisant une syntaxe similaire :
<my:PigFinderPage.Resources>
<!-- your resources go here -->
</my:PigFinderPage.Resources>
Enfin, passez au code-behind pour cette nouvelle page et modifiez sa déclaration de classe afin qu'elle dérive de votre classe personnalisée plutôt que directement de Page, comme ceci :
public partial class EarmarkSearchPage : PigFinderPage
N'oubliez pas de le conserver comme classe partielle.
Cela fonctionne très bien pour moi - je peux définir un tas de propriétés et d'événements personnalisés dans "PigFinderPage" et les utiliser dans tous les descendants.
Autres conseils
Jetez également un œil à Événements joints et voyez si vous pouvez joindre votre événement à chaque page de votre application.Cela pourrait être plus facile qu'une classe intermédiaire personnalisée.
Je ne suis pas sûr de celui-ci, mais en regardant votre erreur, j'essaierais de définir la classe de base avec juste du code c# (.cs) - n'en créez pas une avec XAML, juste un fichier .cs standard qui étend la page WPF. classe.
Ici c'est aussi un tutoriel !c'est assez simple et facile.
Petite mise à jour :J'ai juste essayé de le faire, et ça n'a pas marché.C'est ce que j'ai modifié pour résoudre le problème :
1.Dans de nombreux forums, vous lirez que les sous-pages doivent hériter d'une simple classe cs, sans XAML.Même si ça marche.J'hérite d'une page XAML normale sans aucun problème.
2.J'ai remplacé le code suivant :
<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"
/>
avec
<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"
/>
car lorsque j'avais "clr-namespace" au lieu de "using", Intellisense pouvait reconnaître PigFinderPage, mais pas le compilateur.