SilverLight中鼠标的基本操作
1. 事件路由
在Silverlight中,提供了事件路由,使得我们可以在父节点上接收和处理来自于子节点的事件,
Silverlight中的路由事件采用了冒泡路由策略。
在鼠标事件中MouseLeftButtonDown 、MouseLeftButtonUp 、MouseMove三个事件都支持路由事件,而MouseEnter、MouseLeave两个事件不支持
前台代码:
<Canvas x:Name="ParentCanvas" Background="#404610" Grid.Row="0" Grid.Column="1">
<Rectangle x:Name="RecA" Fill="Orange" Stroke="White" StrokeThickness="2"
Canvas.Top="40" Canvas.Left="60"
Width="160" Height="100"/>
<Rectangle x:Name="RecB" Fill="LightBlue" Stroke="White" StrokeThickness="2"
Canvas.Top="40" Canvas.Left="240"
Width="160" Height="100"/>
<TextBlock x:Name="Status" Foreground="White" Text="Status"
Canvas.Left="100" Canvas.Top="200"/>
</Canvas>
ParentCanvas.MouseLeftButtonDown += new MouseButtonEventHandler(ParentCanvas_MouseLeftButtonDown);
private void ParentCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
String msg = "x:y = " + e.GetPosition(sender as FrameworkElement).ToString();
msg += " from " + (e.OriginalSource as FrameworkElement).Name;
Status.Text = msg;
}
2.拖动
好像TextBlock 和 Rectangle 等图形类的就可以拖,可是如果是Button等控件类的就拖不动。还不知道为什么。
前台代码:
<Canvas Background="#46401F" Grid.Row="1" Grid.Column="0">
<Rectangle
MouseLeftButtonDown="OnMouseDown"
MouseMove="OnMouseMove"
MouseLeftButtonUp="OnMouseUp"
Fill="Orange" Stroke="White" StrokeThickness="2"
Canvas.Top="40" Canvas.Left="60"
Width="160" Height="100"/>
<TextBlock Text="TextBlock" Width="50" Height="40" Canvas.Top="10" Canvas.Left="60" Foreground="Blue"
MouseLeftButtonDown="OnMouseDown"
MouseMove="OnMouseMove"
MouseLeftButtonUp="OnMouseUp"
></TextBlock>
<Button x:Name="btnWelcome"
MouseLeftButtonDown="OnMouseDown"
MouseMove="OnMouseMove"
MouseLeftButtonUp="OnMouseUp"
Canvas.Left="50" Canvas.Top="150" Background="Red"
FontSize="18"
Width="160" Height="80">
</Button>
</Canvas>
后台代码:
bool trackingMouseMove = false;
Point mousePosition;
protected void OnMouseDown(object sender, MouseButtonEventArgs e)
{
FrameworkElement element = sender as FrameworkElement;
mousePosition = e.GetPosition(null);
trackingMouseMove = true;
if (null != element)
{
element.CaptureMouse();
element.Cursor = Cursors.Hand;
}
}
protected void OnMouseMove(object sender, MouseEventArgs e)
{
if (trackingMouseMove)
{
FrameworkElement element = sender as FrameworkElement;
double deltaV = e.GetPosition(null).Y - mousePosition.Y;
double deltaH = e.GetPosition(null).X - mousePosition.X;
double newTop = deltaV + (double)element.GetValue(Canvas.TopProperty);
double newLeft = deltaH + (double)element.GetValue(Canvas.LeftProperty);
element.SetValue(Canvas.TopProperty, newTop);
element.SetValue(Canvas.LeftProperty, newLeft);
mousePosition = e.GetPosition(null);
}
}
protected void OnMouseUp(object sender, MouseButtonEventArgs e)
{
FrameworkElement element = sender as FrameworkElement;
trackingMouseMove = false;
element.ReleaseMouseCapture();
mousePosition.X = mousePosition.Y = 0;
element.Cursor = null;
}