OpenFileDialog导致WPF应用程序崩溃

时间:2012-12-01 03:31:43

标签: c# wpf openfiledialog savefiledialog filedialog

在我的WPF应用程序中,我使用OpenFileDialog选择图像并将其加载到应用程序,这可以正常工作。

但是如果我从闪存驱动器运行相同的应用程序,那么在UI冻结之后图像就会出现问题,UI上的任何点击都会导致应用程序崩溃。

我还有管理员manifest给应用。

6 个答案:

答案 0 :(得分:1)

我找不到一个好的解释,但我解决了这个问题,设置了一个有效的本地路径的InitialDirectory(例如,Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

答案 1 :(得分:0)

从网络驱动器运行之前,我看到过类似的内容。如果未从完全受信任的源加载应用程序,则可以获得SecurityException。

在任何情况下,尝试在代码周围添加一个try / catch块,无法查看是否收到异常。

答案 2 :(得分:0)

此处在这种情况下,OpenFileDialog会导致应用挂起并崩溃。

因此将OpenFileDialog移动到新线程。一切正常。

答案 3 :(得分:0)

我发现这个问题不仅在WPF中发生(崩溃),而且在WinForms中也是如此。 很难说问题的根源是什么,但看起来微软与OpenFileDialog相关的DLL有错误(对我来说,它是CmnDlg32.dll)

我可以调用ShowDialog()函数的唯一方法是将它包装在事件中并在

的帮助下调用
this.BeginInvoke(
        new Action<YourObject, EventArgs>(YourObject_FileDialogOpened), new object[] 
                                                        { YourObjectInstance, e });

其中&#34;这个&#34;是一个控件(例如,表单)。

BeginInvoke(...)授予您调用将以正确方式处理的权限。

如果在按钮单击事件或任何其他类似方案下使用OpenFileDialog调用,则不会出现问题。

答案 4 :(得分:0)

使用OpenFileDialog

时Winform如何崩溃
using(var ofd = new OpenFileDialog())
{
   ofd.Filter = "Image Files (*.png;*.bmp;*.jpg)|*.png;*.bmp;*.jpg";
   if(ofd.ShowDialog() == DialogResult.OK) // <-- reason of crashing
   {
     PictureBox.Image = Image.FromFile(ofd.FileName);
   }
}

如何解决问题

using(var ofd = new OpenFileDialog())
{
   ofd.Filter = "Image Files (*.png;*.bmp;*.jpg)|*.png;*.bmp;*.jpg";
   DialogResult Action = a.ShowDialog();
   if(Action == DialogResult.OK) // <-- To fix
   {
     PictureBox.Image = Image.FromFile(ofd.FileName);
   }
}

答案 5 :(得分:0)

使用类似这样的内容:

Dispatcher.Invoke(new Action(() =>
            {
                using (SaveFileDialog fd = new SaveFileDialog())
                {
                    var json = JsonConvert.SerializeObject(arScene, Formatting.Indented);

                    var bytes = UTF8Encoding.UTF8.GetBytes(json); // or any byte array data

                    fd.Filter = "JSon files (*.json)|*.json|All files (*.*)|*.*|ARScene (*.ARScene)|*.ARScene";
                    fd.Title = "Save an ARScene File";
                    fd.AutoUpgradeEnabled = true;
                    fd.DefaultExt = "ARScene";
                    fd.OverwritePrompt = false;
                    fd.RestoreDirectory = true;
                    fd.SupportMultiDottedExtensions = true;
                    fd.CreatePrompt = false;

                    if (fd.ShowDialog() == DialogResult.OK)
                    {
                        if (fd.FileName != "")
                        {
                            FileStream fs = (FileStream)fd.OpenFile();
                            if (fs != null)
                            {
                                fs.Write(bytes, 0, bytes.Length);
                                fs.Close();
                            }

                        }
                    }
                    fd.Dispose(); // not needed, but save;-)
                }
}));