我在下面有以下代码.高级概述是它是一个从文件共享中获取.emf文件的转换器,然后将其转换为WPF可用于Image.Source的内容:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var fileName = (string)value;
if (fileName == null)
return new BitmapImage();
using (var stream = File.Open(fileName, FileMode.Open))
{
return GetImage(stream);
}
}
internal BitmapImage GetImage(Stream fileStream)
{
var img = Image.FromStream(fileStream);
var imgBrush = new BitmapImage();
imgBrush.BeginInit();
imgBrush.StreamSource = ConvertImageToMemoryStream(img);
imgBrush.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
imgBrush.EndInit();
return imgBrush;
}
public MemoryStream ConvertImageToMemoryStream(Image img)
{
var ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return ms;
}
Run Code Online (Sandbox Code Playgroud)
现在,这里的一切都很好.用户将需要一个"打印校准"页面,因此我将"SampleDoc.emf"文件包含在我的应用程序中并将其标记为资源.
但是,当指向该资源文件时,我似乎无法使File.Open()部分正确.有关如何做到这一点的任何想法?
当您将"SampleDoc.emf"标记为资源时,它仅驻留在已编译的程序集内(非常简单).请参阅我在LightSwitch中获取其他文件,我提出并回答了一个类似的问题,可以回答您的问题.
// creates a StreamReader from the TestFile.txt
StreamReader sr = new StreamReader(assembly.GetManifestResourceStream("SomeFile.txt"));
Run Code Online (Sandbox Code Playgroud)
使用此代码,您可以访问您的资源.
另一种方法是将文件的BuildOption标记为"内容",并将"复制操作"设置为"始终复制"或"仅在更新时",然后在构建项目时将文件复制到输出目录.