Как ссылаться на иконки внутри .resx файлов из xaml?

Я работаю над С# 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}"/>

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

Ответ 1

Свойство 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();

        //http://stackoverflow.com/info/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap/1069509#1069509
        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 значок Bitmap, для которого требуется другой конвертер