Исчезающие иконки в WPF - PullRequest
       17

Исчезающие иконки в WPF

1 голос
/ 26 марта 2009

Я хочу использовать некоторые значки из VS2008ImageLibrary / Actions / pngformat в моем приложении WPF, чтобы получить более наглядный внешний вид Visual Studio, например команду «Вставить стандартные элементы» в WinForms.
Я добавил изображения в качестве ресурсов и сослался на них в своем файле xaml:

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

А потом я добавил изображение в меню и панель инструментов

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

Однако, когда я открываю меню, значок исчезает с панели инструментов, как будто кнопки там никогда не было. Я читал в другом месте, что такого рода вещи происходят из-за отсутствия поддержки .NET иконок Vista / сжатых PNG-файлов. , но я не уверен, что это точно такая же проблема. Мои попытки обойти это путем изменения форматов потерпели неудачу или дали неоптимальные результаты (например, потерю прозрачности). Кто-нибудь знает лучший способ сделать это?

Edit: Для других людей, имеющих эту проблему, создание дублирующих записей с разными ключами в теге для каждой ссылки кажется достаточно функциональным обходным решением, хотя я бы опасался, что изображения могут снова исчезнуть, если их потребуется перезагрузить. по любой причине.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2009

Я думаю, что вы должны определить отдельный ресурс для использования с помощью кнопки:

    <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>

Полагаю, когда вы объявляете ресурс Image, он в основном создает объект типа Image. После этого вы делаете его дочерним по отношению к MenuItem и Button, устанавливая свойства Icon и Content, поэтому оно больше не является деревом. Это не законно.

Если вы попытаетесь объявить вторую кнопку, которая также использует NewIcon, вы получите исключение из логического дерева.

Я не знаю, как MenuItem избежал этого исключения, возможно, он достаточно умен, чтобы удалить элемент Image из дочерних элементов Button (именно так он исчезает), прежде чем добавить изображение в собственную коллекцию логических дочерних элементов.

Хорошо, я только что нашел более простое решение. Вы можете добавить x: Shared = "false" к объявлению изображения в словаре. Это обеспечит создание нового экземпляра этого образа и не нарушит правила дерева wpf.

1 голос
/ 26 марта 2009

Используйте формат, который теряет прозрачность, и установите ключ прозрачности на этот цвет фона.

...