[英]Windows store app magnifier
我正在為Windows 8.1開發繪圖應用程序,需要一種簡單的方法來顯示用戶觸摸的區域。 顯然,使用手指很難看到要繪制的位置。 我需要做的是能夠將目標元素渲染為位圖,並將其顯示給用戶,以便他們可以看到繪制的位置。 我想出的是下面的答案。
代碼如下。 若要使用它,只需將XAML控件(或以編程方式)添加到所需的任何位置,然后將Target屬性設置為要預覽的控件即可。
例如,在我的情況下,我在WebView上繪圖,因此我將WebView設置為Target,然后將放大鏡作為同級添加到WebView。
public class Magnifier : Grid
{
public Magnifier() : base()
{
this.Canvas = new Canvas();
Border border = new Border();
border.HorizontalAlignment = HorizontalAlignment.Left;
border.VerticalAlignment = VerticalAlignment.Top;
border.Child = this.Canvas;
border.BorderBrush = new SolidColorBrush(Colors.Red);
border.BorderThickness = new Thickness(10);
border.Background = new SolidColorBrush(Colors.Black);
this.Children.Add(border);
this.border = border;
}
public async Task<object> Update(int x, int y)
{
this.Visibility = Visibility.Visible;
// changes the amount of magnification
int magnification = 2;
// render the preview of the target
RenderTargetBitmap bitmap = new RenderTargetBitmap();
await bitmap.RenderAsync(this.Target);
this.Canvas.Width = this.PreviewWidth;
this.Canvas.Height = this.PreviewHeight;
double w = this.PreviewWidth / (2 * magnification);
double h = this.PreviewHeight / (2 * magnification);
ImageBrush brush = new ImageBrush();
brush.ImageSource = bitmap;
double scaleX = this.Target.ActualWidth / this.PreviewWidth;
double scaleY = this.Target.ActualHeight / this.PreviewHeight;
TransformGroup transform = new TransformGroup();
TranslateTransform translate = new TranslateTransform();
translate.X = -(x - w) / scaleX;
translate.Y = -(y - h) / scaleY;
transform.Children.Add(translate);
ScaleTransform scale = new ScaleTransform();
scale.ScaleX = scaleX * magnification;
scale.ScaleY = scaleY * magnification;
transform.Children.Add(scale);
brush.Transform = transform;
Rectangle rect = new Rectangle();
rect.Width = this.PreviewWidth;
rect.Height = this.PreviewHeight;
rect.Fill = brush;
this.Canvas.Children.Clear();
this.Canvas.Children.Add(rect);
Ellipse centerDot = new Ellipse();
centerDot.Width = 6;
centerDot.Height = 6;
centerDot.Fill = new SolidColorBrush(Colors.Red);
Canvas.SetLeft(centerDot, this.PreviewWidth / 2 - 3);
Canvas.SetTop(centerDot, this.PreviewHeight / 2 - 3);
this.Canvas.Children.Add(centerDot);
return null;
}
public Canvas Canvas { get; set; }
public int PreviewWidth { get; set; }
public int PreviewHeight { get; set; }
private Border border = null;
public FrameworkElement Target { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.