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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top