Как загрузить файл с библиотекой Prism в приложение WPF? - PullRequest
0 голосов
/ 02 июня 2018

У меня есть приложение WPF, написанное поверх Библиотека призмы

Я хочу разрешить пользователю загружать изображение профиля из своего профиля.В их редактируемом профиле я добавил следующий код XAML

<Grid Grid.Row="10"
      Grid.Column="1">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <TextBox MinWidth="150" HorizontalAlignment="Stretch"
             Grid.Column="0"></TextBox>
    <Button Content="Browse" Command="{Binding Path=UploadImage}"
            Grid.Column="1"
            Margin="0 0 5 0"></Button>
</Grid>

Команда UploadImage должна отобразить диалоговое окно для просмотра изображений на компьютере пользователя.

Использование простых чисел иMVVM, как я могу правильно отобразить файл-браузер?Тогда как я могу загрузить выбранный файл в память?

1 Ответ

0 голосов
/ 02 июня 2018

Обычный способ отобразить диалог открытия файла в WPF и MVVM - это использовать сервис, который представляет диалог открытия файла.Вы должны внедрить этот сервис в вашу ViewModel, используя обычный метод IoC в Prism.

Этот интерфейс INTERFACE не должен зависеть от какого-либо конкретного метода пользовательского интерфейса (обычно его очень легко реализовать в тесте командной строки или модулеtest mock).

РЕАЛИЗАЦИЯ службы должна быть в проекте, который зависит от WPF, и эта реализация должна затем вызывать OpenFileDialog для открытия файла.

Ваша команда кнопки должна вызывать экземплярслужбы, переданной в ViewModel, и откройте диалоговое окно.

Есть много реализаций этой идеи, вот простая:

public interface IOpenFileService
{
/// <summary>
/// Open  file
/// </summary>
/// <returns>True if file selected</returns>
bool? OpenFile();

/// <summary>
/// Full names of the selected files
/// </summary>
string[] FileNames { get; }
}

public class OpenFileService: IOpenFileService
{
    OpenFileDialog _openFileDialog = new OpenFileDialog();
    string[] _selectedFileNames;

    public bool? OpenFile()
    {
        _openFileDialog.Multiselect = true;
        var ofd = _openFileDialog.ShowDialog();
        if (ofd.HasValue && ofd.Value)
        {
            _selectedFileNames = _openFileDialog.FileNames; 
        }
        return ofd;
    }

    public string[] FileNames
    {
        get { return _selectedFileNames ; }
    }
}

Итак, вы регистрируете реализацию службы,и ваша ViewModel получает реализацию в конструкторе:

public class SomeViewModel
{
     public SomeViewModel(IFileOpenService fileOpen)
     {
         this._fileOpen = fileOpen; 
     }

     public void FileOpenCommandExecute
     {
         if (this._fileOpen.OpenFile())
         {
             var selectedFiles = this._fileOpen.FileNames;
             // .. do something with the selected files...
         }
     }
}

Существуют другие реализации, которые поддерживают многие другие типы диалогов, так что вы должны искать их тоже, но это основная идея.

HTH, Том

...