转帖|其它|编辑:郝浩|2010-12-24 16:04:33.000|阅读 352 次
概述:底图控件分为预显层和图形层,预显层用来辅助画图者更准确的绘制图型,图形层用来显示操作者绘制好的图形。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
底图控件分为预显层和图形层,预显层用来辅助画图者更准确的绘制图型,图形层用来显示操作者绘制好的图形。
底图控件提供"捕捉鼠标操作实现绘图功能"(见目标1)
预显层需要实现"绘线辅助提示功能"(见目标2)
图形层需要实现"绘图预显功能"(见目标3)
底图控件(代码如下)
1、捕捉鼠标操作实现绘图功能
<UserControl x:Class="fxhomeSoftMaps.baseMap"
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="//schemas.microsoft.com/expression/blend/2008"
xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400" xmlns:my="clr-namespace:fxhomeSoftMaps">
<Grid x:Name="LayoutRoot">
<Grid x:Name="previewLayer" Background="#FF00D6B4"
MouseLeftButtonDown="previewLayer_MouseLeftButtonDown"
MouseMove="previewLayer_MouseMove"
KeyDown="previewLayer_KeyDown"
>
<my:baseMap_point VerticalAlignment="Top" x:Name="bPoint" HorizontalAlignment="Left" Visibility="Collapsed"/>
<my:baseMap_previewLine x:Name="bLine" VerticalAlignment="Top" HorizontalAlignment="Left" Visibility="Collapsed"/>
</Grid>
<Grid x:Name="graphicsLayer">
</Grid>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace fxhomeSoftMaps
{
public partial class baseMap : UserControl
{
public baseMap()
{
InitializeComponent();
}
#region 属性
//线路集合
private List<Line> _lineList;
public List<Line> lineList
{
get
{
return _lineList;
}
set
{
_lineList = value;
}
}
//画线开关
private bool _lineState = true;
public bool lineState
{
get
{
return _lineState;
}
set
{
_lineState = value;
}
}
//线段开关
private bool lineSegment = false;
#endregion
#region 预览图层-画线操作
//鼠标按下
private void previewLayer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (lineState)
{
//设置预显开始点
bPoint.X = e.GetPosition(null).X;
bPoint.Y = e.GetPosition(null).Y;
bPoint.Visibility = Visibility.Visible;
//设置预显线
bLine.X1 = bPoint.X;
bLine.Y1 = bPoint.Y;
bLine.X2 = bPoint.X;
bLine.Y2 = bPoint.Y;
bLine.Visibility = Visibility.Visible;
//打开线段开关
lineSegment = true;
if (lineSegment == false)
{
}
}
}
//鼠标移动
private void previewLayer_MouseMove(object sender, MouseEventArgs e)
{
if (lineState)
{
bLine.X2 = e.GetPosition(null).X;
bLine.Y2 = e.GetPosition(null).Y;
}
}
//按键
private void previewLayer_KeyDown(object sender, KeyEventArgs e)
{
//如果按ESC 取消画线
if (e.Key == Key.Escape)
{
bPoint.Visibility = Visibility.Collapsed;
bLine.Visibility = Visibility.Collapsed;
}
}
#endregion
#region 图形图层操作
#endregion
}
}
2、绘线辅助提示功能(如图)
1.1 预显线开始点控件(代码如下)
<UserControl x:Class="fxhomeSoftMaps.baseMap_point"
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="//schemas.microsoft.com/expression/blend/2008"
xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Width="4" Height="4">
<Grid x:Name="LayoutRoot" Margin="-2,-2,0,0">
<Ellipse x:Name="baseMapPoint">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#FF00A7FF" Offset="0"/>
<GradientStop Color="#FF44FBFF" Offset="1"/>
<GradientStop Color="#FF14C0FF" Offset="0.575"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace fxhomeSoftMaps
{
public partial class baseMap_point : UserControl
{
public baseMap_point()
{
InitializeComponent();
}
public Double X
{
get { return (Double)GetValue(XProperty); }
set { SetValue(XProperty, value); }
}
// Using a DependencyProperty as the backing store for X. This enables animation, styling, binding, etc...
public static readonly DependencyProperty XProperty =
DependencyProperty.Register("X", typeof(Double), typeof(baseMap_point), new PropertyMetadata(null));
public Double Y
{
get { return (Double)GetValue(YProperty); }
set { SetValue(YProperty, value); }
}
// Using a DependencyProperty as the backing store for Y. This enables animation, styling, binding, etc...
public static readonly DependencyProperty YProperty =
DependencyProperty.Register("Y", typeof(Double), typeof(baseMap_point), new PropertyMetadata(null));
}
}
1.2 预显线结束控件(代码如下)
<UserControl x:Class="fxhomeSoftMaps.baseMap_previewArrow"
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="//schemas.microsoft.com/expression/blend/2008"
xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="30" d:DesignWidth="30">
<Grid x:Name="LayoutRoot" Margin="-15,-15,0,0">
<Line StrokeThickness="2" Y2="30" X2="15" X1="15" Stroke="#FFC00000" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/>
<Line Y1="15" X2="30" Y2="15" Stroke="#FFC00000" StrokeThickness="2" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/>
<Ellipse HorizontalAlignment="Left" Height="10" Margin="10,10,0,0" StrokeThickness="2" VerticalAlignment="Top" Width="10">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#FF5AFF00" Offset="0"/>
<GradientStop Color="Transparent" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace fxhomeSoftMaps
{
public partial class baseMap_previewArrow : UserControl
{
public baseMap_previewArrow()
{
InitializeComponent();
}
}
}
1.3 预显线控件[包含以上两个控件](代码如下)
<UserControl x:Name="userControl" x:Class="fxhomeSoftMaps.baseMap_previewLine"
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="//schemas.microsoft.com/expression/blend/2008"
xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400" xmlns:my="clr-namespace:fxhomeSoftMaps">
<Grid x:Name="LayoutRoot">
<Line x:Name="baseMapLine" Stroke="#FFC00000" StrokeThickness="2" StrokeDashArray="2 2" X1="{Binding X1, ElementName=userControl, Mode=TwoWay}" Y1="{Binding Y1, ElementName=userControl, Mode=TwoWay}" X2="{Binding X2, ElementName=userControl, Mode=TwoWay}" Y2="{Binding Y2, ElementName=userControl, Mode=TwoWay}"/>
<my:baseMap_previewArrow x:Name="baseMap_previewArrow"/>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace fxhomeSoftMaps
{
public partial class baseMap_previewLine : UserControl
{
public baseMap_previewLine()
{
InitializeComponent();
}
#region 附加属性
public Double X1
{
get { return (Double)GetValue(X1Property); }
set { SetValue(X1Property, value); }
}
// Using a DependencyProperty as the backing store for X1. This enables animation, styling, binding, etc...
public static readonly DependencyProperty X1Property =
DependencyProperty.Register("X1", typeof(Double), typeof(baseMap_previewLine), new PropertyMetadata(null));
public Double X2
{
get { return (Double)GetValue(X2Property); }
set
{
SetValue(X2Property, value);
baseMap_previewArrow.Margin = new Thickness(baseMapLine.X2, baseMapLine.Y2, 0, 0);
}
}
// Using a DependencyProperty as the backing store for X2. This enables animation, styling, binding, etc...
public static readonly DependencyProperty X2Property =
DependencyProperty.Register("X2", typeof(Double), typeof(baseMap_previewLine), new PropertyMetadata(null));
public Double Y1
{
get { return (Double)GetValue(Y1Property); }
set { SetValue(Y1Property, value); }
}
// Using a DependencyProperty as the backing store for Y1. This enables animation, styling, binding, etc...
public static readonly DependencyProperty Y1Property =
DependencyProperty.Register("Y1", typeof(Double), typeof(baseMap_previewLine), new PropertyMetadata(null));
public Double Y2
{
get { return (Double)GetValue(Y2Property); }
set
{
SetValue(Y2Property, value);
baseMap_previewArrow.Margin = new Thickness(baseMapLine.X2, baseMapLine.Y2, 0, 0);
}
}
// Using a DependencyProperty as the backing store for Y2. This enables animation, styling, binding, etc...
public static readonly DependencyProperty Y2Property =
DependencyProperty.Register("Y2", typeof(Double), typeof(baseMap_previewLine), new PropertyMetadata(null));
#endregion
}
}
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:博客转载