我正在使用 WPF 为我的 WinRT 应用程序生成平铺图像。我有一个转换为 PNG 的磁贴 UserControl 并且效果很好(确实如此,请不要告诉我其他情况)。WinRT 传递给我一个比例属性 100% (320x150)、140% (434x210) 和 180% (558x270),我用它来生成正确大小的图像。
当我想在我的磁贴中使用图像时。我在我的 tile UserControl 后面的代码中复制了 WinRT 的图像选择功能(您可以提供图像比例,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;
}
谢谢你的帮助。非常感激。