在我的WPF
应用程序中,我使用OpenFileDialog
选择图像并将其加载到应用程序,这可以正常工作。
但是如果我从闪存驱动器运行相同的应用程序,那么在UI
冻结之后图像就会出现问题,UI
上的任何点击都会导致应用程序崩溃。
我还有管理员manifest
给应用。
答案 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;-)
}
}));