如何在 WPF 应用程序中使用 Prism 库上传文件?
How to upload a file with Prism library in WPF application?
我有一个 WPF 应用程序写在 Prism Library
的顶部
我想允许用户从他们的个人资料上传个人资料照片。在他们的编辑个人资料视图中,我添加了以下 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
命令将需要显示一个对话框以浏览用户的 PC 以查找图片。
使用 Prims 和 MVVM,如何正确显示文件浏览器?那如何才能将选中的文件上传到内存中呢?
在WPF和MVVM中显示文件打开对话框通常的方式是使用一个服务,它代表一个打开文件对话框。您应该使用 Prism 中常用的 IoC 方法将此服务注入您的 ViewModel。
此服务接口不应依赖于任何特定的ui方法(通常很容易在命令行测试或单元测试模拟中实现)。
服务的实现应该在依赖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,汤姆
我有一个 WPF 应用程序写在 Prism Library
的顶部我想允许用户从他们的个人资料上传个人资料照片。在他们的编辑个人资料视图中,我添加了以下 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
命令将需要显示一个对话框以浏览用户的 PC 以查找图片。
使用 Prims 和 MVVM,如何正确显示文件浏览器?那如何才能将选中的文件上传到内存中呢?
在WPF和MVVM中显示文件打开对话框通常的方式是使用一个服务,它代表一个打开文件对话框。您应该使用 Prism 中常用的 IoC 方法将此服务注入您的 ViewModel。
此服务接口不应依赖于任何特定的ui方法(通常很容易在命令行测试或单元测试模拟中实现)。
服务的实现应该在依赖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,汤姆