如果您願意,當然可以「緩存」用戶輸入。 實現此目的的一種方法是在用戶輸入時持久保存數據。
如果您有簡單的MainWindow.xaml
和MainWindow.xaml.cs
像這樣
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="30" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<TextBox Text="{Binding User.FirstName,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding User.LastName,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
<Button Grid.Row="1" Content="Save" Command="{Binding SaveCommand}" />
</Grid>
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel();
}
然後使用您提供User
模型,給予它實現INotifyPropertyChanged
,你MainViewModel
就應該像這樣
public class MainViewModel : ViewModelBase
{
// "cache"
private readonly Cache<User> _cache;
private SaveCommand _saveCommand;
public MainViewModel()
{
// if exist, deserialize data
_cache = new Cache<User>();
User = _cache.Deserialize() ?? new User();
// listen properties for changes, serialize
User.PropertyChanged += (sender, args) => _cache.Serialize(User);
// provide cache file name to save command
SaveCommand = new SaveCommand(_cache.File);
CommandManager.RegisterClassCommandBinding(
typeof(MainViewModel), new CommandBinding(SaveCommand));
}
private User _user;
public User User
{
get { return _user; }
set { _user = value; OnPropertyChanged(); }
}
public ICommand SaveCommand { get; private set; }
}
在上面的代碼中,如果存在,則將「緩存」的數據加載到viewmodel的屬性中。如果不是,只需傳入一個新實例。然後,在用戶類型時,所有更改都立即序列化(如XML)。
當執行SaveCommand時,該緩存被刪除。否則,無論用戶何時進入主窗口(無論應用程序是關閉還是崩潰),都是可用的。
Cache<T>
以下,以及簡單的SaveCommand
執行。
public class Cache<T> where T : new()
{
private readonly XmlSerializer _serializer = new XmlSerializer(typeof(T));
private readonly string _file = string.Format("{0}.xml", typeof(T).Name);
public void Serialize(T obj)
{
using (var writer = XmlWriter.Create(_file))
_serializer.Serialize(writer, obj);
}
public T Deserialize()
{
if (!System.IO.File.Exists(File))
return default(T);
using (var reader = XmlReader.Create(_file))
return (T) _serializer.Deserialize(reader);
}
public string File { get { return _file; } }
}
public class SaveCommand : ICommand
{
public event EventHandler CanExecuteChanged;
private readonly string _file;
public SaveCommand(string file)
{
_file = file;
}
public void Execute(object parameter)
{
Debug.WriteLine("Save logic here, maybe...");
Debug.WriteLine(string.Format("...and remove cache file {0}", _file));
File.Delete(_file);
}
public bool CanExecute(object parameter)
{
return true;
}
}
下面是真是太神奇了UI的擷取畫面:)和相關的XML格式。
<?xml version="1.0" encoding="utf-8"?>
<User xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FirstName>My first...</FirstName>
<LastName>....and last name</LastName>
</User>
這豈不是更好地使應用程序不會崩潰?否則,我猜你可以將重要信息寫入一個臨時文本文件,該文件在保存時會被清除。寫入註冊表是另一種選擇。 – noMad17 2014-11-06 20:58:02
這不是非常重要的信息。相反,它被保存而不是被刪除。這是一個預防措施,只要他們關閉窗口也有*緩存的原因很多。 – Master 2014-11-06 21:02:41
關閉和崩潰是不一樣的。您可以處理一個關閉事件。 – Paparazzi 2014-11-06 21:29:07