Henehefu 用 ウィキ

メニュー



- Views

最近の更新

取得中です。

WPFメモ > XAMLをEMFに変換する


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

XAML2EMF とか XamlToEmf のようなもの

とりあえず出力できればいい場合

お膳立て

  1. http://xamltoys.codeplex.com/からソースをダウンロード(あとで中身をいじるのでソースのほうを推奨)
  2. ダウンロードしたプロジェクトをビルドする
  3. EMFを出力したいプロジェクトを作成するか、開くかする
  4. メニューの[プロジェクト]/[参照の追加]の[参照タブ]でさっきビルドしたXamlToys.dllを指定する

コード

private void Button_Click(object sender, RoutedEventArgs e)
        {
            try {
                // c:\wpf.emf にウィンドウの内容を出力する
                var drawing = Utility.GetDrawingFromXaml(this);
                using(var graphics = Utility.CreateEmf(@"c:\wpf.emf", drawing.Bounds)) {
                    Utility.RenderDrawingToGraphics(drawing, graphics);
                }
                MessageBox.Show("出力完了");
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }
 

問題点

  • ファイルがなかなか解放されない
  • なんかレイアウトが変更される

自分に都合のいいように修正する

ファイルがなかなか解放されないのを修正

XamlToysプロジェクトのXamlToys.cs内のUtilityクラスに
CreateEmfのStreamバージョンを追加する。

public static d.Graphics CreateEmf(Stream stream, Rect bounds)
        {
            if(bounds.Width == 0 || bounds.Height == 0)
                bounds = new Rect(0, 0, 1, 1);
            using(d.Graphics refDC = d.Graphics.FromImage(new d.Bitmap(1, 1)))
                return d.Graphics.FromImage(new di.Metafile(stream, refDC.GetHdc(),
                   bounds.ToGdiPlus(), di.MetafileFrameUnit.Pixel, di.EmfType.EmfPlusDual));
        }
 

なんかレイアウトが変更されるのを修正する

おなじくXamlToysのUtilityクラスのGetDrawingFromXamlメソッドを
次のように修正する。
public static Drawing GetDrawingFromXaml(object xaml) {
	var drawing = FindDrawing(xaml);
	if (drawing != null) return drawing;
 
	var fe = xaml as FrameworkElement;
	if (fe != null) {
		fe.UpdateLayout(); // ← これを追加(しないでもOKぽい?)
		// ↓これを消す
		//RealizeFrameworkElement(fe);
		drawing = WalkVisual(fe);
	}
		// Handle FrameworkContentElement
	return drawing;
}
 

んで自分のコードも修正

private void Button_Click(object sender, RoutedEventArgs e)
        {
            try {
                var drawing = Utility.GetDrawingFromXaml(this);
                using(var stream = File.Create(@"c:\wpf.emf"))
                using(var graphics = Utility.CreateEmf(stream, drawing.Bounds)) {
                    Utility.RenderDrawingToGraphics(drawing, graphics);
                }
                MessageBox.Show("出力完了");
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }
 

その他

↓のGetDrawingXamlにthisのかわりにButtonやGridなどの
エレメントオブジェクトをぶちこめば、それだけレンダリングされる。
var drawing = Utility.GetDrawingFromXaml(this);
 

タグ一覧