【发布时间】:2015-04-14 10:48:46
【问题描述】:
我有一个简单的Window 按钮,当我点击Button 时,第二个Window 被打开。第二个Window 有一个Image 控件,它显示一个.png 文件。因此,如果我将FileObject 属性用于Binding,一切正常,我可以从File Explorer 中删除文件。但是,如果我将FileName 属性用于Binding,我无法从File Explorer 中删除文件,我会遇到操作系统异常。即使我关闭第二个窗口,我也无法执行此操作,即使我明确调用 GC。
FileName 属性有什么问题?有任何想法吗?
Win 7,网络 4.0
窗口1
<Grid>
<Button Content="Ok"
Width="100"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Click="Click"
Padding="0,2,0,2"
IsDefault="True"
Name="_btnOk"/>
</Grid>
public partial class Window : Window
{
public Window()
{
InitializeComponent();
DataContext = this;
}
private void Click(Object sender, RoutedEventArgs e)
{
var window = new Window3();
window.ShowDialog();
}
}
窗口2
<Grid>
<Image Source="{Binding FileObject}"></Image>
</Grid>
public partial class Window2 : Window
{
public Window2()
{
InitializeComponent();
DataContext = this;
FileName = "D:/pdf/myfile.png";
Closing += Window2_Closing;
}
public String FileName { get; set; }
public Object FileObject
{
get
{
if (String.IsNullOrEmpty(FileName))
return null;
if (!File.Exists(FileName))
return null;
var ms = new MemoryStream();
var bi = new BitmapImage();
using (var fs = new FileStream(FileName, FileMode.Open, FileAccess.Read))
{
fs.CopyTo(ms);
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
}
return bi;
}
}
void Window2_Closing(Object sender, System.ComponentModel.CancelEventArgs e)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
【问题讨论】:
-
你为什么要这样绑定? Here's how to do it.
-
仅供参考,
FileObject属性 getter 中不需要 MemoryStream。只需设置bi.StreamSource = fs;和bi.CacheOption = BitmapCacheOption.OnLoad;。该属性还应返回ImageSource或BitmapSource而不是object。