Как ссылаться на иконки внутри .resx файлов из xaml? - PullRequest
10 голосов
/ 26 апреля 2011

Я работаю над приложением C # WPF, использующим файлы .resx для управления ресурсами.Сейчас я пытаюсь добавить иконки (.ico) в проект, но у меня возникают некоторые проблемы.

<Image Name="imgMin" Grid.Column="0"
       Stretch="UniformToFill"
       Cursor="Hand" 
       MouseDown="imgMin_MouseDown">
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            <Setter Property="Source" Value="\Images\minimize_glow.ico"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Source" Value="\Images\minimize_glow.ico"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

Это работает нормально, но когда я перемещаю значок в AppResources.resx, у меня возникают проблемы с ссылками на него в коде xaml.Что я должен использовать вместо строк Setter Property = ... выше?Это:

<Setter Property="Source" Value="{x:Static res:AppResources.minimize}"/>

не работает, я думаю, что мне, вероятно, нужно использовать свойство, отличное от «Source», потому что Value - это не строка, указывающая на иконку, а сама иконка.Хотя я не могу понять, какой из них использовать - какую-нибудь помощь, пожалуйста?

1 Ответ

3 голосов
/ 26 апреля 2011

Свойство Source не «хочет» строку, оно просто конвертирует ее, когда ее получает.Если вы добавите значок к ресурсам, он будет иметь тип System.Drawing.Icon.Вам нужно будет преобразовать его в ImageSource через конвертер.

Вы можете сделать статический доступ к ресурсам, но он должен соответствовать ожидаемому синтаксису x:Static.

например

xmlns:prop="clr-namespace:Test.Properties"
<Image MaxHeight="100" MaxWidth="100">
    <Image.Source>
        <Binding Source="{x:Static prop:Resources.icon}">
            <Binding.Converter>
                <vc:IconToImageSourceConverter/>
            </Binding.Converter>
        </Binding>
    </Image.Source>
</Image>
public class IconToImageSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var icon = value as System.Drawing.Icon;
        var bitmap = icon.ToBitmap();

        ///64229/zagruzit-wpf-bitmapimage-iz-system-drawing-bitmap#64249
        MemoryStream ms = new MemoryStream();
        bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        ms.Position = 0;
        BitmapImage bi = new BitmapImage();
        bi.BeginInit();
        bi.StreamSource = ms;
        bi.EndInit();

        return bi;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Примечания:

  • Модификатор доступа к ресурсам должен быть общедоступным
  • Если изображение добавляется как«Изображение» в итоге вы получите Bitmap вместо иконки, для чего требуется другой конвертер
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...