1

事前に生成された EMF ファイルを指定されたプリンター/トレイに送信する必要がある WPF アプリケーションがあります。

PrintDialog を表示したくありません。実際のプリンター/トレイは事前に構成されています。また、EMF ファイルを実際に表示する必要もありません。むしろ、それをプリンターに送るだけです。

これまでのところ、これに関する私の研究開発は、EMF と WPF とそれがサポートされていない方法を扱う 5 年前の一連の投稿につながりました。

これで運が良かった人はいますか?誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

0

これは思ったより簡単だったことがわかりました。Imageこれは、コントロールとコンバーターの使用を介して行うことができます。この例では、emfファイルのファイルの場所を取得し、それをWPFユーザーコントロールに配置して、プリンターに送信します。

XAMLの場合:

<Grid Margin="12">
    <Image Source="{Binding Path=FileName, Converter={StaticResource emfImageConverter}, Mode=OneWay}"></Image>
</Grid>

およびコンバータークラス:

[ValueConversion(typeof(string), typeof(BitmapImage))]
public class EmfImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var fileName = (string)value;
        if (fileName == null || !File.Exists(fileName))
            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 { CacheOption = BitmapCacheOption.OnLoad, CreateOptions = BitmapCreateOptions.PreservePixelFormat };
        imgBrush.BeginInit();
        imgBrush.StreamSource = ConvertImageToMemoryStream(img);
        imgBrush.EndInit();
        return imgBrush;
    }

    public MemoryStream ConvertImageToMemoryStream(Image img)
    {
        var ms = new MemoryStream();
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        return ms;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2012-06-29T19:41:31.447 に答える