我有一个调用异步方法的按钮,我想在这个方法的回调中打开 SaveFileDialog,我知道它会引发安全异常
但是任何解决方法,我都依赖回调来知道参数将在保存对话框中使用
例如我调用 webservice 来检查文件是否存在
如果存在和 word 版本,我会将 savefiledilaoge 的属性设置为 word 等等
调用 webservice 进行检查是异步的,所以在回调中我得到了我想知道的所有信息
我有一个调用异步方法的按钮,我想在这个方法的回调中打开 SaveFileDialog,我知道它会引发安全异常
但是任何解决方法,我都依赖回调来知道参数将在保存对话框中使用
例如我调用 webservice 来检查文件是否存在
如果存在和 word 版本,我会将 savefiledilaoge 的属性设置为 word 等等
调用 webservice 进行检查是异步的,所以在回调中我得到了我想知道的所有信息
如果您使用的是 MVVM Light 之类的框架,您可以从回调中向 UI 线程发送消息(传递保存所需的参数)。
编辑。添加示例
在您的代码隐藏页面中,您很可能需要为我们将发送的自定义消息设置一个侦听器。在您的 onload 或 onnavigateto 方法中执行此操作是一种很好的做法。我假设您的回调将加载一个名为CustomObjectWithParams
您从 db 获取的自定义对象。
在您背后的 xaml 代码中:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// the "MyViewModel.OpenSaveDialogRequest" can be any string.. it just needs to synch up with what was sent from the viewmodel below
Messenger.Default.Register<CustomObjectWithParams>(this, "MyViewModel.OpenSaveDialogRequest", objParams => ShowSaveDialog(objParams));
base.OnNavigatedTo(e);
}
private void ShowSaveDialog(CustomObjectWithParams obj) {
// do your open save here in the UI thread
}
// be smart, make sure you unregister this listener when you navigate away!
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
Messenger.Default.Unregister<CustomObjectWithParams>(this);
base.OnNavigatedFrom(e);
}
现在在您的视图模型回调函数中(未在 UI 线程上运行)...您想要发送您获得异步的参数。你可以这样做:
protected void your_asynch_callbackfunction(your args) {
CustomObjectWithParams objParams = new CustomObjectWithParams();
// fill up this object here....
// now send the object to the UI to do something with it
Messenger.Default.Send<CustomObjectWithParams>(objParams, "MyViewModel.OpenSaveDialogRequest");
}
搞砸这个我在一个小型测试项目中尝试过这个,也许你想做这样的事情..既然你拒绝发布相关代码,让别人和我一样依赖我们的读心技巧
public class AsyncSaveTester : 'put yourclassIheritance Here'
{
private SaveFileDialog asyncSaveDialog;
public SaveFileDialog AsyncSaveDialog
{
get { return asyncSaveDialog; }
set { asyncSaveDialog = value; }
}
private void Button_Click(object sender, EventArgs e)
{
asyncSaveDialog = new SaveFileDialog();
//Write your code to Show the Dialog here
}
// where is the handler for your webservice call...find that and call the Save method from there
private void Save(string fileToSave)
{
Stream fileStream = asyncSaveDialog.OpenFile();
// If you choose to use Streaming, then you would write the code here to do the file Streaming from
// the web Service call
}
}