7
votes

WPF Personnalisé Control: Modèle à l'image

Je crée un contrôle personnalisé WPF, une touche code> avec un image code> et texte code>. J'ai ajouté deux propriétés de dépendance au contrôle, imagePath code> et texte code> et le modèle de commande (dans thèmes \ generic.xaml) est un panneau de pile simple qui organise l'image et Texte horizontalement.

Le texte code> La propriété fonctionne bien. Mais pour une raison quelconque, l'exemple d'image dans mon projet de test n'apparaît pas lorsque j'utilise templatetbinding code> à la propriété code> imagePath code> de dépendance pour obtenir son chemin. J'ai testé l'image en remplaçant temporairement le modèle code> dans le contrôle personnalisé avec un chemin d'accès à l'image, auquel cas il apparaît. P>

J'espère que quelqu'un avec plus d'expérience dans Cette zone peut jeter un coup d'œil et dites-moi pourquoi le contrôle ne fonctionne pas comme prévu. Merci pour votre aide. P>

My VS 2008 Solution contient un projet, CustomControldemo. Le projet contient un contrôle personnalisé, TaskButton.Cs et une fenêtre principale, Window1.xaml, que j'utilise pour tester le contrôle. Mon image de test, calendar.png, est située dans un dossier Ressources au niveau racine du projet et générique.xaml est situé dans un dossier thématique, également au niveau racine du projet. P>

ici est le code de mon contrôle personnalisé (à partir de TaskButton.cs): p> xxx pré>

et voici le modèle de commande (à partir de générique.xaml): p> xxx Pre>

et enfin, voici la fenêtre 1 Marquillage que j'utilise pour tester le contrôle: P>

<Window x:Class="CustomControlDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:customControl="clr-namespace:CustomControlDemo"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <customControl:TaskButton ImagePath="Resources\calendar.png" Text="Calendar" />
    </Grid>
</Window>


0 commentaires

4 Réponses :


4
votes

image ne prend pas une chaîne comme source :) Vous pouvez voir cela à IntelliSense. Vous devez vous attacher à une image de l'image (ou utilisez un inveneuvertter pour convertir la chaîne en une imageSource)

voir Cette question pour certains Conseils sur la façon de faire cette conversion.


0 commentaires

10
votes

Je vais laisser la réponse de CWAP en tant que réponse acceptée, car elle est techniquement correcte. Cependant, il s'avère qu'il existe un moyen plus facile de résoudre ce problème.

templatebindings ne sont pas des objets de liaison de première classe. Ils sont conçus pour être légers, ils sont donc à sens unique et ils manquent de certaines caractéristiques d'autres objets de liaison. Plus particulièrement, ils ne prennent pas en charge les convertisseurs de types connus associés à une cible. Voir MacDonald, Pro WPF en C # 2008 , p. 872. C'est pourquoi la CWAP réagit correctement que je devrais probablement créer un convertisseur de type et la référencer spécifiquement dans le modèle de contrôle pour mon bouton personnalisé.

mais je n'ai pas à utiliser un modèle à lier le Modèle de contrôle à la propriété ImagePath de mon contrôle personnalisé. Je peux utiliser un ancien objet de liaison uni. Voici le balisage révisé pour mon modèle de contrôle personnalisé:

xxx

Si vous regardez l'imagecontrol dans le modèle, Vous pouvez voir le changement. Notez la propriété RelativeVource dans le même objet. Réglage de cette propriété sur = {RelateSource TemplatePparent} est ce qui me permet de saisir un chemin relatif dans ma fenêtre1 instance de Taskboutton et de le résoudre correctement dans le contrôle personnalisé.

Donc, ma recommandation pour que les autres recherchent ce fil Soyez de sauter le convertisseur de valeur et de passer simplement de modèle à la liaison pour la liaison pour la propriété de l'image.

Merci également à Marco Zhou, qui a fourni Cette réponse à une question similaire dans le forum MSDN WPF.


0 commentaires

2
votes

En fait, aucune de ces réponses n'est correcte.

{templatebinding imagePath} n'est rien de plus qu'un raccourci pour {chemin de liaison = imagePath, RelateSource = {RelateSource TemplatedParent}}} Et tel est presque complètement identique. < / p>

Également si vous fournissez une chaîne pour imagePath il résoudra correctement à un imagesource Bien que vous preniez un coup de contact dans la performance de l'application. Le problème réel concerné avec le chemin d'image relatif et absolu sur le fichier imagePath = "Ressources \ calendar.png" dans le XAML pour le test. Cet indices le compilateur à penser que le chemin fourni est absolu en raison de l'utilisation de \ au lieu de / dans la définition du chemin.

La raison pour laquelle la forme longue des travaux de liaison et le raccourci ne correspond pas à ce qu'il fournit des indices au compilateur que la source de l'image fournie (ressources \ calendar.png) est un chemin relatif non un chemin absolu, Par conséquent, l'image est trouvée et les travaux de liaison. Si vous déboguez la liaison, vous verrez que le raccourci essaie de résoudre la chaîne fournie dans une source d'image, mais ne peut pas trouver le fichier "Ressources \ calendar.png" si vous fournissez une URI complète à l'image IE "C: \ ... \ Ressources \ calendar.png " ou la notation de mélange correspondante de " / application; composant / ressources / calendar.png " alors l'image sera trouvée et la liaison résolue.

Ce point devient vraiment important lorsque vous essayez de référencer des images d'une source externe au lieu de celles compilées en tant que ressources dans la compilation finale.


0 commentaires

0
votes

manière simple (testée) 1-Effectuez votre valeurConverter comme celui-ci xxx

2-Bind Votre source d'image à la chaîne de la chaîne de parent (j'ai utilisé "tag" propriété) comme ce xaml: xxx


0 commentaires