2009-03-26 8 views
1

Je cherche à utiliser certaines icônes de VS2008ImageLibrary/Actions/pngformat dans mon application WPF pour obtenir un aspect plus visuel de Visual Studio - comme la commande "Insérer des éléments standard" dans WinForms.
J'ai ajouté les images que les ressources et les évoquées dans ma fichier XAML:Icônes disparaissant dans WPF

<DockPanel.Resources> 
     <Image x:Key="NewIcon" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16"/> 
</DockPanel.Resources> 

Et puis j'ai ajouté l'image au menu et barre d'outils

<MenuItem Command="ApplicationCommands.New" Icon="{StaticResource NewIcon}"/> 
<!-- ... --> 
<Button Command="ApplicationCommands.Save"><StaticResourceExtension ResourceKey="SaveIcon"/></Button> 

Cependant, quand je ouvrir le menu, l'icône disparaît de la barre d'outils, comme si le bouton n'était jamais là.J'ai lu ailleurs que ce genre de chose se produit en raison du manque de support de .NET pour les icônes Vista/Compressed PNG, mais je ne suis pas sûr c'est exactement le même problème. Mes tentatives pour contourner ce problème en changeant de format ont échoué ou ont donné des résultats sous-optimaux (comme la perte de transparence). Est-ce que quelqu'un sait d'une meilleure façon de le faire?

Edit: Pour d'autres personnes ayant ce problème, faire des entrées en double avec des clés différentes dans les < DockPanel.Resources> pour chaque référence semble être une solution assez fonctionnelle, bien que je serais inquiet que les images pourraient disparaître encore une fois si elles doivent être rechargées pour une raison quelconque.

Répondre

3

Je pense que vous devez définir une ressource distincte pour l'utilisation avec le bouton:

<DockPanel.Resources> 
     <Image x:Key="NewIconForMenu" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16"/> 
<Image x:Key="NewIconForButton" Source="Toolbar Images/NewDocumentHS.png" Height="16" Width="16"/> 
</DockPanel.Resources> 

Je suppose que, lorsque vous déclarez une ressource d'image, il crée essentiellement objet de type image. Après cela, vous en faites un enfant de MenuItem et du bouton en définissant les propriétés Icon et Content, donc ce n'est plus un arbre. Ce n'est pas légal.

Si vous essayez de déclarer le deuxième bouton qui utilise également NewIcon, vous obtiendrez une exception de l'arborescence logique. Je ne sais pas comment MenuItem a échappé à cette exception, peut-être est-il assez intelligent pour supprimer l'élément Image des enfants de Button (c'est ainsi qu'il disparaît) avant d'ajouter l'image à sa propre collection logique enfants.

D'accord, je viens de trouver une solution plus simple. Vous pouvez ajouter x: Shared = "false" à la déclaration d'image dans le dictionnaire. Cela garantira qu'une nouvelle instance de cette image est créée et qu'elle ne casse pas les règles de l'arborescence wpf.

+0

Ah, ça a beaucoup de sens. x: Shared = "false" est exactement le type de solution que je cherchais. Merci beaucoup. –

1

Utilisez le format qui perd la transparence et définissez la touche de transparence sur cette couleur d'arrière-plan.

+1

Le problème avec l'utilisation de formats sans transparence est que je perds l'anti-aliasing sur les images. De plus, cela nécessite de modifier toutes les icônes pour s'assurer que l'arrière-plan ne correspond à aucune autre couleur de la palette. Cela pourrait fonctionner, mais j'espère vraiment une solution plus élégante. –

+0

Oui, cette solution est bonne si vous voulez juste faire une application brute force, mais puisque ce n'est pas ce que vous voulez et vous n'avez pas obtenu de réponses jusqu'à présent, je mettrais une prime. – Kredns

Questions connexes