XamlParseException во время выполнения. Переключение с x: Static на относительную компонентную строку для ссылки на изображение исправляет это. Почему?


Я разрабатываю свое первое крупное приложение с использованием WPF/C# и пытаюсь лучше понять ресурсы ссылок.

Многие гиды советуют мне использовать первый способ, который я не использую.
  • я проектирую ресурс в illustrator
  • сделайте его 96 точек на дюйм,
  • сохраните его как png,

Тогда Я:

  • Открытые Ресурсы.resx
  • Нажмите Добавить Ресурс- > Изображение
  • выберите мой существующий PNG под названием "SuperInt_Alert"
  • измените тип сборки этого нового png к ресурсу

Затем, когда я пытаюсь показать изображение в моем xaml, я использую это:

xmlns:prop="clr-namespace:Stark.Properties"

<Image Source="{x:Static prop:Resources.SuperInt_Alert}"  HorizontalAlignment="Center" VerticalAlignment="Top"
               Grid.Row="1"
               Grid.Column="1"
               ></Image>

Дает мне систему.Окна.Разметка.XamlParseException с сообщением='укажите значение на 'системы.Окна.Разметка.StaticExtension " выдал исключение.". Конструктор Xaml также не показывает мое изображение. Он пустой, но ошибок нет.

Пока

<Image Source="/Stark;component/Resources/SuperInt_Alert.png"  HorizontalAlignment="Center" VerticalAlignment="Top"
       Grid.Row="1"
       Grid.Column="1"
       ></Image>

Работает просто отлично. Он даже показывает это в моем дизайнере.

Почему?

Я просто пытаюсь понять. различия между двумя способами использования ресурса. Что плохого в первом способе? На самом деле мне больше нравится первый способ, потому что когда я ввожу имя ресурса, он позволяет мне использовать IntelliSense для автоматического заполнения имени ресурса.[41]} второй путь не делает этого, потому что он подобен струне.

Кроме того, мне не нужно устанавливать тип ресурса Public, правильно? Я могу оставить его как внутренний, потому что ни один другой проект не использует мой файл ресурсов? Я просто должен убедиться, что тип сборки установите значение ресурс / контент / встроенный ресурс, правильно?

Большое спасибо!

1 2

1 ответ:

Да, я, конечно, согласен, что этот вариант: Source= " {x: Static prop: Resources.SuperInt_Alert} " лучше. И да, вы можете и должны использовать его. И вы правильно назвали причину своей проблемы. Чтобы иметь возможность ссылаться из XAML на свойство из ресурсов, вы должны сделать их общедоступными-делая их внутренними, генерирует XamlParseException, вы упомянули. Я не уверен на 100%, почему это так, но я предполагаю, что это потому, что Xaml должен быть проанализирован. Он анализируется внешними сборками. И получить правильный код значения из этих сборок должен ссылаться на ресурсы в вашем проекте, но они являются внутренними, поэтому обычно недоступны за пределами сборки.

Кроме того, вам потребуется преобразовать объект Bitmap, загруженный из ресурсов, в ImageSource. Для этого вы можете использовать привязку и применить там соответствующий конвертер. Вот примерный класс преобразователя:

public class BitmapToImageSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        MemoryStream ms = new MemoryStream();
        ((System.Drawing.Bitmap)value).Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        BitmapImage image = new BitmapImage();
        image.BeginInit();
        ms.Seek(0, SeekOrigin.Begin);
        image.StreamSource = ms;
        image.EndInit();

        return image;
    }

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

Вышеуказанный класс взят из http://www.shujaat.net/2010/08/wpf-images-from-project-resource.html вы будете необходимо добавить BitmapToImageSourceConverter к ресурсам в вашем окне:

<Window.Resources>
    <my:BitmapToImageSourceConverter x:Key="imageSourceConverter"/>
</Window.Resources>

Вот как вы должны определить свое изображение, чтобы использовать конвертер:

 <Image Source="{Binding Source={x:Static prop:Resources.Picture1}, Converter={StaticResource imageSourceConverter}}"/>