我知道这个主题有很多主题,我尝试从VB实现(翻译)this one到C#中。
Table fileContainer = {string FileName, binary File}
这是我的尝试:
partial void FileContainersAddAndEditNew_Execute()
{
Dispatchers.Main.BeginInvoke(() =>
{
OpenFileDialog openDialog = new OpenFileDialog();
if (openDialog.ShowDialog() == true)
{
using (System.IO.FileStream fileData = openDialog.File.OpenRead())
{
long fileLen = fileData.Length;
if (fileLen > 0)
{
Byte[] fileBArray = new Byte[fileLen];
fileData.Read(fileBArray, 0, fileLen);
fileData.Close();
FileContainer fc = this.FileContainers.AddNew();
fc.File = fileBArray;
fc.FileName = openDialog.File.Extension.ToString().ToLower();
}
}
}
});
}
但是这行代码失败了:
FileContainer fc = this.FileContainers.AddNew();
出现此错误:
IVisualCollection<T>.AddNew() should not be called from UI Thread.
我有点困惑。我想:
Dispatchers.Main.BeginInvoke(() =>
阻止了这种情况的发生。或者我做错了吗?
我注意到的另一件事是VB代码使用:
filenLen-1
但是我试图这样做了。他们也不会将其投放到int
,但.Read
不会将long
作为参数。
答案 0 :(得分:4)
openFileDialog.ShowDialog()
不会返回bool值,也不能在if语句中使用。 openFileDialog.ShowDialog()
将打开对话框。据我所知,执行暂停,直到您关闭对话框并且没有理由检查它是否打开。
filenLen-1
using (System.IO.FileStream fileData = openDialog.File.OpenRead());
long fileLen = fileData.Length;
应该是
filenLen--;
using (System.IO.FileStream fileData = System.IO.File.OpenRead(openDialog.FileName))
int fileLen = int.Parse(fileData.Length.ToString());
fileData.Read(fileBArray, 0, fileLen);
需要fileLen为整数。因为某个原因,fileData返回一个long,这可能会导致问题。
至于调用问题,我必须确切知道你要做些什么来帮助你。也许我们可以避免调用。
答案 1 :(得分:3)
我在这里发布我的更新代码,以免为未来的读者搞砸我的原始代码。这应该有用;
partial void FileContainersAddAndEditNew_Execute()
{
var supportedFiles = "*.*";
Dispatchers.Main.BeginInvoke(() =>
{
OpenFileDialog openDialog = new OpenFileDialog();
openDialog.Filter = "Supported files|" + supportedFiles;
if (openDialog.ShowDialog() == true)
{
using (System.IO.FileStream fileData = openDialog.File.OpenRead())
{
long fileLen = fileData.Length;
if (fileLen > 0)
{
Byte[] fileBArray = new Byte[fileLen--];
fileData.Read(fileBArray, 0, (int)fileLen);
fileData.Close();
var filename = openDialog.File.ToString().ToLower();
this.FileContainers.Details.Dispatcher.BeginInvoke(() =>
{
FileContainer fc = this.FileContainers.AddNew();
fc.File = fileBArray;
fc.FileName = filename;
});
}
}
}
});
}