您的位置:首页 > 其它

Silverlight带关闭动画的内容控件,可移动的内容控件(二)

2011-08-14 22:49 218 查看
B.可移动的内容控件

此控件可以通过在鼠标左键按下的状态下同时拖动鼠标便可以移动控件,实现拖拽的效果。

先来看Xaml

View Code

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SuperMapStandardMapApp1
{
public class FloatPanel : ContentControl
{
private bool isMouseDown;
private Point mouseCurrentPoint;
private TranslateTransform panelTranslate;

public FloatPanel()
{
DefaultStyleKey = typeof(FloatPanel);
}

public override void OnApplyTemplate()
{
base.OnApplyTemplate();
RenderTransform = panelTranslate = new TranslateTransform();
UIElement moveBar = GetTemplateChild("MoveBar") as UIElement;
//为移动面板,关闭面板提供事件
if (moveBar != null)
{
moveBar.MouseLeftButtonDown += new MouseButtonEventHandler(moveBar_MouseLeftButtonDown);
moveBar.MouseLeftButtonUp += new MouseButtonEventHandler(moveBar_MouseLeftButtonUp);
moveBar.MouseMove += new MouseEventHandler(moveBar_MouseMove);
}
}

void moveBar_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
UIElement MoveBarELement = sender as UIElement;
Point point = e.GetPosition(null);
double x0 = this.panelTranslate.X;
double y0 = this.panelTranslate.Y;
this.panelTranslate.X = x0 + (point.X - mouseCurrentPoint.X);
this.panelTranslate.Y = y0 + (point.Y - mouseCurrentPoint.Y);
mouseCurrentPoint = point;
}
}

void moveBar_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
UIElement MoveBarELement = sender as UIElement;
MoveBarELement.ReleaseMouseCapture();
isMouseDown = false;
}

void moveBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
UIElement MoveBarELement = sender as UIElement;
mouseCurrentPoint = e.GetPosition(null);
MoveBarELement.CaptureMouse();
isMouseDown = true;
}

public bool IsOpen
{
get { return (bool)GetValue(IsOpenProperty); }
set { SetValue(IsOpenProperty, value); }
}

public static DependencyProperty IsOpenProperty = DependencyProperty.Register("IsOpen", typeof(bool), typeof(FloatPanel), new PropertyMetadata(true, IsOpenPropertyChange));

public static void IsOpenPropertyChange(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
((FloatPanel)sender).ChangeVisualState(true);
}

private void ChangeVisualState(bool IsChange)
{
if (IsOpen)
{
VisualStateManager.GoToState(this, "Open", IsChange);
}
else
{
VisualStateManager.GoToState(this, "Close", IsChange);
}

}
}
}


在 OnApplyTemplate方法中获取moveBar 为UIElement元素,并为其添加鼠标点下,鼠标移动,鼠标放开事件。在鼠标点下时MoveBarELement.ReleaseMouseCapture();锁定鼠标至MoveBar上,鼠标移动时改变先前定义的panelTranslate,x值与y值,实现鼠标移动且元素跟着移动的效果。在鼠标放开是MoveBarELement.CaptureMouse();以释放对鼠标的锁定。

这样便可以定义一个能拖拽的面版!且面板样式可随大家任意改动!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐