Как правило, ваш пользовательский интерфейс будет просто привязываться к свойствам вашей виртуальной машины:
Ваша виртуальная машина будет использовать BackgroundWorker
для работы над фоновым потоком и для периодического обновления значения CurrentProgress
. Что-то вроде этого:
public class MyViewModel : ViewModel
{
private readonly BackgroundWorker worker;
private readonly ICommand instigateWorkCommand;
private int currentProgress;
public MyViewModel()
{
this.instigateWorkCommand =
new DelegateCommand(o => this.worker.RunWorkerAsync(),
o => !this.worker.IsBusy);
this.worker = new BackgroundWorker();
this.worker.DoWork += this.DoWork;
this.worker.ProgressChanged += this.ProgressChanged;
}
// your UI binds to this command in order to kick off the work
public ICommand InstigateWorkCommand
{
get { return this.instigateWorkCommand; }
}
public int CurrentProgress
{
get { return this.currentProgress; }
private set
{
if (this.currentProgress != value)
{
this.currentProgress = value;
this.OnPropertyChanged(() => this.CurrentProgress);
}
}
}
private void DoWork(object sender, DoWorkEventArgs e)
{
// do time-consuming work here, calling ReportProgress as and when you can
}
private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.CurrentProgress = e.ProgressPercentage;
}
}
У меня действительно хакерское решение с этим ...
<style type="text/css">
input[type="file"]
{
width: 80px;
}
</style>
<input id="File1" type="file" />
Проблема заключается в атрибуте ширины, который является скрытие текстового поля, очевидно, будет различаться в зависимости от браузера, в разных темах Windows XP и так далее.Может, с этим можно поработать? ...
Это будет очень сложно. Проблема с типом ввода файла заключается в том, что он обычно состоит из двух визуальных элементов, при этом рассматривается как один DOM-элемент. Добавьте к этому то, что несколько браузеров имеют свой собственный внешний вид для ввода файла, и вы готовы к кошмару. См. Статью на сайте quirksmode.org об особенностях ввода файла. Я гарантирую, что это не сделает вас счастливыми (я говорю по собственному опыту).
[РЕДАКТИРОВАТЬ]
На самом деле, я думаю, вам может сойти с рук помещение ввода в элемент контейнера (например, div) и добавление отрицательного поля к элементу. Эффективно скрывает часть текстового поля за пределами экрана. Другой вариант - использовать технику из статьи, на которую я ссылаюсь, попытаться оформить ее как кнопку.