WinRT アプリのタイル イメージを生成するために WPF を使用しています。PNG に変換されたタイル UserControl があり、これはうまく機能します (それ以外の場合は教えてください)。WinRT は、正しいサイズの画像を生成するために使用するスケール プロパティ 100% (320x150)、140% (434x210)、および 180% (558x270) を渡します。
タイルに画像を使いたいとき。タイル UserControl のコード ビハインドで、WinRT の画像選択機能を複製しました (画像の 3 つのスケールを指定すると、WinRT アプリは自動的に正しいスケールを選択します)。そのため、縮尺に応じて、大きいまたは小さい画像ソースを選択します。ただし、大きな縮尺では、フォント サイズは同じサイズのままで、非常に小さく見えます。これは WinRT で発生することではないため、スケールに基づいてフォント サイズを変更する必要はないと思います。そのため、UserControl を PNG に変換するために使用しているコードであり、DPI に関係するものである必要があります。ここに私の変換コードがあります:
// I pass in 320x150 or 434x210 or 558x270 depending on the scale.
public static MemoryStream ToPng(
this FrameworkElement frameworkElement,
double width,
double height)
{
BitmapSource bitmapSource = ToBitmapSource(frameworkElement, width, height);
PngBitmapEncoder pngBitmapEncoder = new PngBitmapEncoder();
pngBitmapEncoder.Frames.Add(BitmapFrame.Create(bitmapSource));
MemoryStream memoryStream = new MemoryStream();
pngBitmapEncoder.Save(memoryStream);
memoryStream.Position = 0;
return memoryStream;
}
public static BitmapSource ToBitmapSource(
this FrameworkElement frameworkElement,
double width,
double height)
{
Size renderingSize = new Size(width, height);
frameworkElement.Measure(renderingSize);
Rect renderingRectangle = new Rect(new Point(0, 0), renderingSize);
frameworkElement.Arrange(renderingRectangle);
frameworkElement.UpdateLayout();
Rect bounds = VisualTreeHelper.GetDescendantBounds(frameworkElement);
RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
(int)frameworkElement.ActualWidth,
(int)frameworkElement.ActualHeight,
96,
96,
PixelFormats.Pbgra32);
DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
VisualBrush visualBrush = new VisualBrush(frameworkElement);
drawingContext.DrawRectangle(visualBrush, null, new Rect(new Point(), bounds.Size));
}
renderBitmap.Render(drawingVisual);
return renderBitmap;
}
助けてくれてありがとう。とても有難い。