-5

我有一个调用异步方法的按钮,我想在这个方法的回调中打开 SaveFileDialog,我知道它会引发安全异常

但是任何解决方法,我都依赖回调来知道参数将在保存对话框中使用

例如我调用 webservice 来检查文件是否存在

如果存在和 word 版本,我会将 savefiledilaoge 的属性设置为 word 等等

调用 webservice 进行检查是异步的,所以在回调中我得到了我想知道的所有信息

4

2 回答 2

1

如果您使用的是 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");

        }
于 2012-12-18T13:38:27.367 回答
0

搞砸这个我在一个小型测试项目中尝试过这个,也许你想做这样的事情..既然你拒绝发布相关代码,让别人和我一样依赖我们的读心技巧

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
    }
}
于 2012-12-18T13:48:10.050 回答