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 ответ:
Да, я, конечно, согласен, что этот вариант: 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}}"/>