银光 SaveFileDialog 出现错误:“对话框必须由用户启动”

6
我遇到了一个错误:
Dialog must be user-initiated

当我从我的Silverlight应用程序打开保存文件对话框时,我使用以下代码:

主按钮单击事件:

 private void btnSaveAttach_Click(object sender, RoutedEventArgs e)
        {
            if (EditableGV.SelectedItems.Count == 1)
            {
                PositionAttachment posAtt = new PositionAttachment();
                posAtt = (PositionAttachment)EditableGV.SelectedItems[0];
                SaveFile(posAtt.File, posAtt.FileName);

            }
            else
            {
                RadWindow.Alert("Please select a attachment from the existing attachments list.", null);
                return;
            }

        }

private void SaveFile(byte[] fileByte, string fileName)
    {
        try
        {
            byte[] fileBytes = fileByte;//your bytes here 

            //Show the dialog        

            SaveFileDialog dialog2 = new SaveFileDialog();
            saveDialog = dialog2.ShowDialog();//This line is giving the error

            if (saveDialog == true)
            {
                //Get the file stream
                dialog2.DefaultFileName = fileName;
                string fileExt = fileName.Substring(fileName.LastIndexOf('.'), fileName.Length);
                dialog2.DefaultExt = "All Files|*.*|" + fileExt + "|*." + fileExt + "";
                using (Stream fs = (Stream)dialog2.OpenFile())
                {
                    fs.Write(fileBytes, 0, fileBytes.Length);
                    fs.Close();

                    //File successfully saved
                }
            }
        }
        catch 
        {
            MessageBox.Show("Error in downloading file");
        }
    }
<StackPanel x:Name="Layout">
    <StackPanel x:Name="Messagepanel" Margin="2" Visibility="Collapsed">
        <TextBlock x:Name="txtMessage" Text="1"  Height="35"></TextBlock>
    </StackPanel>
    <StackPanel Orientation="Horizontal" Margin="4">
        <sdk:Label Height="28" Content="Select File:"   Name="lblSelectFile" Grid.Column="0" Grid.Row="0"  Width="70" />
        <TextBox Name="txtFileName" IsReadOnly="True" HorizontalAlignment="Left" VerticalAlignment="Center"  Width="303" Grid.Column="1" Margin="12,1,0,0"></TextBox>
        <Button Content="Browse" Name="btnBrows" Width="55" Height="22"  HorizontalAlignment="Left" VerticalAlignment="Center" Margin="16,1,0,0" Click="btnBrows_Click" Grid.Column="1" />
    </StackPanel>
    <StackPanel Orientation="Horizontal" Margin="4">
        <sdk:Label Height="28" Content="Description:"   Name="lblFileDescription" Grid.Column="0" Grid.Row="1"  Width="70" />
        <TextBox Height="60"   Name="txtComments" Grid.Column="1" 
         VerticalScrollBarVisibility="Auto" Width="301" Margin="13,0,85,2" Grid.Row="1" />
    </StackPanel>
    <StackPanel Orientation="Horizontal" Margin="4">

        <Button x:Name="OKButton" Content="Add" Click="OKButton_Click" Width="43" Margin="363,6,10,15" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left" />

        <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="53" HorizontalAlignment="Right" Margin="0,6,200,15" Grid.Row="2" Grid.Column="1" />
    </StackPanel>
    <StackPanel Orientation="Vertical" Margin="4" Height="224">
        <sdk:Label Content="Existing Attachment(s):" Height="20" Margin="15,7,324,10" Name="lblExistingAttachemnt"  />
        <telerikGrid:RadGridView x:FieldModifier="public" 
                         x:Name="EditableGV" 
                         AutoGenerateColumns="False" 
                         ItemsSource="{Binding PositionAttachemntCollection, Mode=TwoWay}" Margin="0,0,0,7" Height="150">
            <telerik:RadGridView.Columns>
                <telerik:GridViewDataColumn DataMemberBinding="{Binding FileName,Mode=TwoWay}"></telerik:GridViewDataColumn>
                <telerik:GridViewDataColumn DataMemberBinding="{Binding FileDescription,Mode=TwoWay}"></telerik:GridViewDataColumn>
                <!--<telerik:GridViewColumn Header="" >
                    <telerik:GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <telerik:RadButton Name="btnDownlaod" Content="Save" Click="HyperlinkButton_Click"></telerik:RadButton>
                            <<HyperlinkButton Click="HyperlinkButton_Click"  Content="{Binding FileName,Mode=OneWay}" TargetName="_blank" NavigateUri="http://www.google.com" />
                        </DataTemplate>
                    </telerik:GridViewColumn.CellTemplate>
                </telerik:GridViewColumn>-->
            </telerik:RadGridView.Columns>
        </telerikGrid:RadGridView>

        <StackPanel Orientation="Horizontal" Margin="0">
            <!--<Button Content="Save Attachment" Name="btnSaveAttach" Width="112" Margin="263,6,10,15"  Click="btnSaveAttach_Click" />-->
            <Button Content="Close" Name="btnClose" Width="75" Margin="3,6,10,15" Click="btnClose_Click" />
        </StackPanel>

    </StackPanel>
</StackPanel>

这个函数是在按钮点击时调用的。我想知道为什么在同一页面上也有一个openFiledialog,但它成功地打开了对话框而没有任何错误。为什么SaveFileDialog会导致错误。

以下是错误的堆栈跟踪:

    at System.Windows.Controls.SaveFileDialog.ShowDialogInternal(Window owner)
   at System.Windows.Controls.SaveFileDialog.ShowDialog()
   at IPVWorkbench.Views.AddPositionAttachments.btnSaveAttach_Click(Object sender, RoutedEventArgs e)
   at System.Windows.Controls.Primitives.ButtonBase.OnClick()
   at System.Windows.Controls.Button.OnClick()
   at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName, UInt32 flags)

1
在按钮点击和此调用之间有什么代码?用户操作和对话框出现之间有最短时间限制。如果您超过了该时间限制,将会收到此错误提示。 - ChrisF
我只是获取文件数据并将其存储到公共变量“fileByte”中。 - Rohit Vyas
你从哪里获取数据?它是使用异步调用吗? - ChrisF
嗯,那就不知道了。它明显认为对话框不是由用户发起的。 - ChrisF
@ChrisF 我已经在我的主帖中更新了按钮点击的代码(btnSaveAttach_Click),请看一下并建议一些解决方法..我现在真的很沮丧 :-( - Rohit Vyas
显示剩余8条评论
3个回答

2

1

您需要在btnSaveAttach_Click中调用 SaveFileDialog(这样它就是用户发起的)。还要删除所有断点,因为它们也可能导致该错误。

试一试看它是否有效,然后根据它构建代码的其余部分:

private void btnSaveAttach_Click(object sender, RoutedEventArgs e)
{
    SaveFileDialog dialog2 = new SaveFileDialog();
    saveDialog = dialog2.ShowDialog();
}

无法工作...仍然出现相同的错误,我已经删除了所有断点。 - Rohit Vyas
你使用的 SL 版本是哪个? - Salvador Sarpi
我刚试了一下这段代码,它能够正常工作。尝试将行 SaveFileDialog dialog2 = new SaveFileDialog(); 移出该方法,只留下 dialog2.ShowDialog(); - Salvador Sarpi

0
我已经找到了一个解决办法。在按钮单击时,我显示了一个确认框,并在确认框的“确定”事件上打开了保存文件对话框,这样就不会抛出任何异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接