原文:WPF设置VistualBrush的Visual属性制作图片放大镜效果

效果图片:


原理:
设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放。

XAML代码:
// Window1.xaml
<Window x:Class="MagnifyingGlass.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Magnifying Glass" Width="595" Height="612"
    >
  <Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVis" />
  </Window.Resources>
  <Grid VerticalAlignment="Center" Margin="10">
    <Grid Name="mainGrid" >
      <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
      </Grid.ColumnDefinitions>

<StackPanel Grid.ColumnSpan="3" Orientation="Horizontal" Margin="0,0,0,20">
        <TextBlock Margin="5">Target size:</TextBlock>
        <TextBox Name="txtTargetSize" Text="50" TextChanged="ZoomChanged" />
      </StackPanel>
      <Slider Name="sliderTargetSize" Margin="263.5,-0.313333333333333,0.5,0"
                        Value="{Binding ElementName=txtTargetSize,Path=Text}"
                        Minimum="2" Maximum="400" Grid.Column="1" Height="22" VerticalAlignment="Top" />
      <CheckBox Name="checkEnableMagnifier" IsChecked="True"
                HorizontalAlignment="Left" Margin="181,6.84333333333333,0,0" Grid.Column="1" Height="13.6866666666667" VerticalAlignment="Top" Width="69">
        Magnifier
      </CheckBox>
      <Button Grid.Row="4" Grid.Column="1" Click="ExitClick" Content="E_xit" MinWidth="75" MinHeight="23" HorizontalAlignment="Left" Margin="277,1.00000000000006,0,-1.00000000000006" Width="75" />
      <Image Grid.Row="2" Grid.Column="1" Name="imageDemo" Source="C:/Documents and Settings/Administrator/桌面/lake.jpg" Grid.ColumnSpan="4" Height="400" Width="660" PreviewMouseMove="OnMoveOverMainUI" />
    </Grid>
    <Canvas HorizontalAlignment="Left" VerticalAlignment="Top">
      <Canvas Name="magnifierCanvas" IsHitTestVisible="False"
              Visibility="{Binding ElementName=checkEnableMagnifier,Path=IsChecked,Converter={StaticResource BoolToVis}}">
        <Line StrokeThickness="30" X1="200" Y1="200" X2="300" Y2="300">
          <Line.Stroke>
            <LinearGradientBrush StartPoint="0.78786,1" EndPoint="1,0.78786">
              <GradientStop Offset="0" Color="DarkGreen" />
              <GradientStop Offset="0.9" Color="LightGreen" />
              <GradientStop Offset="1" Color="Green" />
            </LinearGradientBrush>
          </Line.Stroke>
        </Line>
        <Ellipse Width="250" Height="250" Fill="White" />
        <Ellipse Width="250" Height="250" Name="magnifierEllipse" StrokeThickness="3">
          <Ellipse.Fill>
            <VisualBrush ViewboxUnits="Absolute" Viewbox="0,0,50,50"
                         ViewportUnits="RelativeToBoundingBox" Viewport="0,0,1,1"/>
          </Ellipse.Fill>
          <Ellipse.Stroke>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
              <GradientStop Offset="0" Color="#AAA" />
              <GradientStop Offset="1" Color="#111" />
            </LinearGradientBrush>
          </Ellipse.Stroke>
        </Ellipse>
        <Ellipse Canvas.Left="2" Canvas.Top="2" StrokeThickness="4" Width="246" Height="246">
          <Ellipse.Stroke>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
              <GradientStop Offset="0" Color="#555" />
              <GradientStop Offset="1" Color="#EEE" />
            </LinearGradientBrush>
          </Ellipse.Stroke>
        </Ellipse>
      </Canvas>
    </Canvas>
  </Grid>
</Window>

C#代码: 
// Window1.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Input;

namespace MagnifyingGlass
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>

public partial class Window1 : Window
    {
        VisualBrush vb;
        public Window1()
        {
            InitializeComponent();
            vb = (VisualBrush) magnifierEllipse.Fill;
            vb.Visual = imageDemo;
        }

private void ExitClick(object sender, RoutedEventArgs e)
        {
            Close();
        }

private void ZoomChanged(object sender, EventArgs e)
        {
            if (magnifierEllipse != null)
            {
                Rect viewBox = vb.Viewbox;
                double val;
                if (!double.TryParse(txtTargetSize.Text, out val)) return;
                viewBox.Width = val;
                viewBox.Height = val;
                vb.Viewbox = viewBox;
            }
        }

private void OnMoveOverMainUI(object sender, MouseEventArgs e)
        {
            Point pos = e.MouseDevice.GetPosition(mainGrid);
            if(imageDemo.IsHitTestVisible)
            {
                Rect viewBox = vb.Viewbox;
                double xoffset = viewBox.Width / 2.0;
                double yoffset = viewBox.Height / 2.0;
                viewBox.X = pos.X - xoffset;
                viewBox.Y = pos.Y - yoffset;
                vb.Viewbox = viewBox;
                Canvas.SetLeft(magnifierCanvas, pos.X - magnifierEllipse.Width / 2);
                Canvas.SetTop(magnifierCanvas, pos.Y - magnifierEllipse.Height / 2);
            }
        }
    }
}

还想对镜头做点其他效果处理?那就再看看这里:WPF中利用RadialGradient模拟放大镜效果,改进它,你就可以得到你需要的更炫效果。

WPF设置VistualBrush的Visual属性制作图片放大镜效果的更多相关文章

  1. 原生javascript实现图片放大镜效果

    当我们在电商网站上购买商品时,经常会看到这样一种效果,当我们把鼠标放到我们浏览的商品图片上时,会出现类似放大镜一样的一定区域的放大效果,方便消费者观察商品.今天我对这一技术,进行简单实现,实现图片放大 ...

  2. Magnifier.js - 支持鼠标滚轮缩放的图片放大镜效果

    Magnifier.js 是一个 JavaScript 库,能够帮助你在图像上实现放大镜效果,支持使用鼠标滚轮放大/缩小功能.放大的图像可以显示在镜头本身或它的外部容器中.Magnifier.js 使 ...

  3. 【Demo】jQuery 图片放大镜效果——模仿淘宝图片放大效果

    实现功能: 模仿淘宝图片放大效果,鼠标移动到小图片的某一处,放大镜对应显示大图片的相应位置. 实现效果: 实现代码: <!DOCTYPE html> <html> <he ...

  4. javascript图片放大镜效果展示

    javascript图片放大镜效果展示 <!DOCTYPE html> <html> <head lang="en"> <meta cha ...

  5. 使用CSS3 BACKFACE-VISIBILITY属性制作翻转动画效果

    摘要: 通过backface-visibility:hidden;属性,我们可以使一个元素在翻转之后消失,这是可以使用另一个元素放在它的背面,从而制作出一种元素翻转之后出现另一个元素的效果. ... ...

  6. 如何通过PS制作图片文字效果

    如图这是最终效果,下面我为大家介绍如何制作这种图片文字效果 准备一张图: 方法,步骤: 首先我们打开PHOTOSHOP,插入一张图片. 之后按键盘上面的"T"键快捷键启用文字工具, ...

  7. jQuery实现图片放大镜效果

    实现图片放大镜的原理: 给放大镜元素一个对应的html元素为<div class='right'> 设置这个div的宽高固定为某个值(350px,350px) 设置div的css为超出部分 ...

  8. canvas知识02:图片放大镜效果

    效果截图: JS代码: <script> // 初始化canvas01和上下文环境 var cav01 = document.getElementById('cav01'); var cx ...

  9. Canvas + JavaScript 制作图片粒子效果

    首先看一下源图和转换成粒子效果的对比图:       左侧图片为源图,右侧图片为粒子效果图.该效果是在Canvas画布上制作的.将图片制作成粒子效果相对而言是比较简单的.重点了解两个知识点即可 1:图 ...

随机推荐

  1. Advanced Data Structures

    Advanced Data Structures Advanced Data Structures

  2. Linux查看硬盘使用时间等信息

    查看硬盘信息的很多命令,都需要root权限,如果普通用户无法看到信息,请切换至root: 1.查看硬盘使用时间等信息 硬盘使用时间很重要,硬盘理论寿命是3万小时以上 $ sudo smartctl - ...

  3. OCP读书笔记(3) - 使用RMAN恢复目录

    创建恢复目录 在hndx上创建恢复目录:[oracle@oracle admin]$ export ORACLE_SID=hndx[oracle@oracle admin]$ sqlplus / as ...

  4. Ubuntu9.04更新源

    1.sudo gedit /etc/apt/sources.list 编辑你的源列表,加入以下列表中你认为适合你的,拷贝到你的列表中,然后保存列表. Archive.ubuntu.com更新serve ...

  5. VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表

    原文:VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表 Excel具有强大的图表显示.分析功能,这点毋庸置疑,但是如果将常规MIS系统中的数据以报表的形式在Excel中显示,却并不那 ...

  6. DOS批处理延时技术

    DOS批处理延时技术 举个例子,我们要延时5秒打开gdh.txt这个文件,可以用以下几个方法 方法一:ping  缺点:时间精度为1秒,不够精确   www.2cto.com   @echo off  ...

  7. 解决vmware“二进制转换和长模式与此平台兼容.....”问题

    问题描述: 启动vmware显现:1.二进制转换和长模式与此平台兼容....字等.: 2.vmware启动一会,系统直接重新启动,这个现象出如今惠普电脑上 问题原因: 出现这种原因一般都是因为系统Vi ...

  8. Django URL 命名空间

    https://docs.djangoproject.com/en/1.5/topics/http/urls/#introduction 译文: URL 命名空间 简介: 当你需要部署一个应用的多个实 ...

  9. AOP 之 6.1 AOP基础 ——跟我学spring3(转)

    http://jinnianshilongnian.iteye.com/blog/1418596

  10. 在spring MVC的controller中获取ServletConfig

    在使用SmartUpload进行文件上传时,须要用到srevletConfig: 假设是在servlet中写当然是非常easy实现的: private ServletConfig config; // ...