Управление изображением не отображается - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь создать приложение WPF с несколькими небольшими редакторами.Один из этих редакторов требует загрузить два изображения, ввести имя в TextBox и нажать кнопку «Сохранить».

В коде это работает безупречно.Файлы сохраняются в модели, и изображение может быть загружено.Перед нажатием кнопки сохранения оба изображения фактически отображаются в редакторе.Однако после повторного открытия (для редактирования) отображается только одно изображение.

Я немного протестировал и обнаружил, что всегда первое изображение не обрабатывается, а второе -.

Например,в XAML это выглядит так:

<Image Name="BackgroundImage" Grid.Row="1" Grid.Column="0" Source="{Binding Path=Background}" Width="120" Height="90"/>
<Image Name="ForegroundImage" Grid.Row="2" Grid.Column="0" Source="{Binding Path=Foreground}" Width="120" Height="90"/>

Здесь BackgroundImage не отображается, даже если свойство Background модели успешно загрузило изображение,Если бы я поменял эти теги XAML, то есть поместил элемент управления ForegroundImage над BackgroundImage , тогда ForegroundImage не будет отображаться, пока BackgroundImage делаетДаже если я не изменю что-либо еще, например Grid.Row или Column.

Затем я попытался загрузить изображения из кода в обработчик событий Loaded окна:

private void LocationEditor_OnLoaded(object sender, RoutedEventArgs e)
{
    BackgroundImage.Source = ((Location)DataContext).Background;
    ForegroundImage.Source = ((Location)DataContext).Foreground;
}

То же самое относится и к этой ситуации.Какая бы строка ни выполнялась первой, она не будет отображаться в окне.

В случае, если это поможет, вот код свойства Background ( Foreground isпостроено так же):

[JsonIgnore]
public BitmapImage Background
{
    get
    {
        if (!string.IsNullOrWhiteSpace(BackgroundFile))
        {
            SetFree();
            SetImage();
        }
        else
            _background = null;
        return _background;
    }
}

Метод SetFree () освобождает ресурсы памяти, если изображение больше не нужно.Это происходит, когда окно закрывается или когда требуется BitmapImage .(Он будет перезагружать изображение каждый раз, когда файл изображения изменился.)

Метод SetImage () выполняет одну простую вещь: загрузка изображения BackgroundFile файл изображения и сохраняет его в поле _background .


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

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Должно быть что-то не так с вашими SetFree() или SetImage() методами.

К счастью, вам совсем не нужны свойства Background и Foreground в вашей модели представления, потому что WPF предоставляетвстроенное автоматическое преобразование типов из string, Uri и byte[] в ImageSource.Следовательно, вы можете напрямую связать свойства источника изображения с соответствующими свойствами пути в модели представления:

<Image ... Source="{Binding BackgroundFile}"/>
<Image ... Source="{Binding ForegroundFile}"/>

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

public ImageSource Background
{
    get
    {
        if (BackgroundFile != null)
        {
            try
            {
                return new BitmapImage(new Uri(BackgroundFile));
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

        return null;
    }
}
0 голосов
/ 16 октября 2018

Проблемы с привязкой могут быть сложными для устранения неполадок.Иногда сроки оценки привязки не очевидны или не имеют смысла.Я знаю, что это общий ответ, но я использую один прием, чтобы добавить «конвертер отладки» для привязок, с которыми у меня возникают проблемы, которые можно отлаживать во время оценки.Это спасло меня несколько раз.

<UserControl
 xmlns:converters="clr-namespace:WhateverYourNamespaceIs.Converters">
<UserControl.Resources>
<converters:DebugConverter x:Key="DebugConverter"/>
</UserControl.Resources>

<Image Name="BackgroundImage" Grid.Row="1" Grid.Column="0" Source="{Binding Path=Background, Converter={StaticResource DebugConverter}" Width="120" Height="90"/>




Here is an example of the converter.

public sealed class DebugConverter : IValueConverter
    { 


        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            //Debug.WriteLine("Debug Converter Value:" + value.ToString());
            // Since you are working with graphics, maybe just dump the size
Debug.WriteLine("Debug Converter Value:" + value.Length().ToString());
            return (value);
        }


        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...