代码改变世界

Silverlight系列(右键菜单、控件移动的实现)

2010-03-10 14:03  key_sky  阅读(1415)  评论(0编辑  收藏  举报

1.右键菜单

第一步在html页添加如下代码:

<param name="windowless" value="true" />

第二步在xaml页添加右键菜单呈现的内容:

<Border x:Name="brrightMenu" BorderBrush="Black" BorderThickness="2" Background="Green" Width="100"
HorizontalAlignment
="Left" Visibility="Collapsed">
<StackPanel>
<HyperlinkButton x:Name="btnAddElement" Foreground="Black" Content="添加新图片元素"
Margin
="5" Click="btnAddElement_Click" ></HyperlinkButton>
<HyperlinkButton x:Name="btnAddTextElement" Foreground="Black" Content="添加新文字元素"
Margin
="5" Click="btnAddTextElement_Click" ></HyperlinkButton>
</StackPanel>
<!--右键菜单的内容-->
<!--右键菜单的位置-->
<Border.RenderTransform>
<TranslateTransform x:Name="tt" />
</Border.RenderTransform>
</Border>

第三步cs页面添加如下代码:

public partial class MainPage : UserControl
{
ContextMenu menu
= null;

public MainPage()
{
InitializeComponent();
menu
= new ContextMenu(new RightElement(tt, brrightMenu, 255, 12, 0, 0));
}

ContextMenu.cs:

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;
using System.Windows.Browser;

namespace DragElement
{
/// <summary>
/// 鼠标右键菜单实现
/// </summary>
public class ContextMenu
{
RightElement Element;

public ContextMenu(RightElement element)
{
Element
= element;
HtmlPage.Document.AttachEvent(
"oncontextmenu", this.onContextMenu);
}

private void onContextMenu(object sender, HtmlEventArgs e)
{
if (Math.Abs(Element.RX) <= 40 && Math.Abs(Element.RY) <= 10)
{
Element.BD.Visibility
= Visibility.Visible;
//Element.TT.X = e.OffsetX - Element.X;
//Element.TT.Y = e.OffsetY - Element.Y;
Element.TT.X = 350;
Element.TT.Y
= 205;
e.PreventDefault();
//阻止默认DOM
}
}
}
}

运行效果:

2.控件移动的实现

DragElement.xaml:

<Grid x:Name="LayoutRoot" HorizontalAlignment="Left" Width="Auto" Height="Auto"
ShowGridLines
="True" VerticalAlignment="Top" Margin="5,5,5,5"
MouseLeftButtonDown
="LayoutRoot_MouseLeftButtonDown"
MouseMove="LayoutRoot_MouseMove">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250" />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<layoutToolkit:Accordion Grid.Column="0" Width="240" Background="LightGreen" FontSize="14">
<layoutToolkit:AccordionItem Header="选项">
<ContentControl>
<StackPanel>
<HyperlinkButton x:Name="ResumeLayout" Foreground="Green"
Content="还原设计器元素布局" Margin="5"
Click
="ResumeLayout_Click" Width="220"></HyperlinkButton>
<HyperlinkButton x:Name="UpdateLayout" Foreground="Green"
Content="更改设计器元素布局" Margin="5"
Click
="UpdateLayout_Click" Width="220"></HyperlinkButton>
<HyperlinkButton x:Name="FixedLayout" Foreground="Green"
Content="固定设计器元素布局" Margin="5"
Click
="FixedLayout_Click" Width="220"></HyperlinkButton>
<HyperlinkButton x:Name="SaveLayout" Foreground="Green"
Content="保存设计器元素布局" Margin="5"
Click
="SaveLayout_Click" Width="220"></HyperlinkButton>
<HyperlinkButton x:Name="btnFullScreen" Foreground="Green"
Content="全屏" Margin="5"
Click
="btnFullScreen_Click" Width="220"></HyperlinkButton>
</StackPanel>
</ContentControl>
</layoutToolkit:AccordionItem>

<layoutToolkit:AccordionItem Content="设置" Header="设置" >
</layoutToolkit:AccordionItem>
</layoutToolkit:Accordion>
<Canvas Background="LightCyan" x:Name="canvas" HorizontalAlignment="Left"
VerticalAlignment="Top" Width="1000" Height="750" Grid.Row="0" Grid.Column="1" >

<TextBlock x:Name="tb1" Foreground="Green" Width="Auto" Height="25"
Canvas.Top="30" ></TextBlock>
<TextBlock x:Name="tb2" Foreground="Red" Width="Auto" Height="25" ></TextBlock>
<StackPanel>
<Border x:Name="brrightMenu" BorderBrush="Black" BorderThickness="2"
Background="Green" Width="100" HorizontalAlignment="Left" Visibility="Collapsed">
<StackPanel>
<HyperlinkButton x:Name="btnAddElement" Foreground="Black" Content="添加新图片元素"
Margin
="5" Click="btnAddElement_Click" ></HyperlinkButton>
<HyperlinkButton x:Name="btnAddTextElement" Foreground="Black" Content="添加新文字元素"
Margin
="5" Click="btnAddTextElement_Click" ></HyperlinkButton>
</StackPanel>
<!--右键菜单的内容-->
<!--右键菜单的位置-->
<Border.RenderTransform>
<TranslateTransform x:Name="tt" />
</Border.RenderTransform>
</Border>
</StackPanel>
</Canvas>

</Grid>
<!--
为 Silverlight 插件配置参数,windowless="true"
-->

DragElement.cs:

bool trackingMouseMove = false;
Point mousePostion;
private void UpdateLayout_Click(object sender, RoutedEventArgs e)
{
foreach (UIElement ui in canvas.Children)
{
StackPanel mysp
= ui as StackPanel;
if (mysp != null)
{
AddHandles(mysp);
}
}
}
/// <summary>
/// 鼠标移动实现
/// </summary>
private void AddHandles(StackPanel myPanel)
{
myPanel.MouseLeftButtonDown
+= new MouseButtonEventHandler(MouseDown);
myPanel.MouseLeftButtonUp
+= new MouseButtonEventHandler(MouseUp);
myPanel.MouseMove
+= new MouseEventHandler(MouseMove);
}
private void MouseDown(object sender, MouseButtonEventArgs e)
{
FrameworkElement element
= sender as FrameworkElement;
mousePostion
= e.GetPosition(null);

trackingMouseMove
= true;

if (null != element)
{
element.CaptureMouse();
//将鼠标捕获设置为元素

element.Cursor
= Cursors.Hand;

}
}
private void MouseUp(object sender, MouseButtonEventArgs e)
{
FrameworkElement element
= sender as FrameworkElement;

trackingMouseMove
= false;

element.ReleaseMouseCapture();
//移除鼠标捕获

element.Cursor
= null;
}
private void MouseMove(object sender, MouseEventArgs e)
{
FrameworkElement element
= sender as FrameworkElement;

if (trackingMouseMove)
{
double pointY = e.GetPosition(null).Y - mousePostion.Y;

double pointX = e.GetPosition(null).X - mousePostion.X;

double newPointY = pointY + (double)element.GetValue(Canvas.TopProperty);

double newPointX = pointX + (double)element.GetValue(Canvas.LeftProperty);

if (newPointX < 0 || newPointY < 0 || newPointX > 1000 || newPointY > 750)
{
//限定鼠标移动范围
return;
}

element.SetValue(Canvas.TopProperty, newPointY);

element.SetValue(Canvas.LeftProperty, newPointX);

mousePostion
= e.GetPosition(null);

tb1.Text
= "当前相对位置X:" + newPointX + " Y:" + newPointY;

ResumeLine(sender
as StackPanel);

}
}

Operate.cs:

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;

using System.Windows.Browser;
using System.Windows.Media.Imaging;


namespace DragElement
{
public class OperateElement
{
public Canvas canvas { get; set; }

public void btnDelElement_Click(object sender, RoutedEventArgs e)
{
HtmlWindow html
= HtmlPage.Window;
if (html.Confirm("确认要删除吗?"))
{
HyperlinkButton button
= sender as HyperlinkButton;
StackPanel sp
= button.Parent as StackPanel;
ResumeLine(sp);
canvas.Children.Remove(sp);
//删除panel
}
}

private void ResumeLine(StackPanel sp)
{
List
<Path> lp = new List<Path>();
foreach (UIElement ui in canvas.Children)
{
Path path
= ui as Path;
if (path != null)
{
var name
= path.Name;
foreach (UIElement ui2 in sp.Children)
{
HyperlinkButton hb
= ui2 as HyperlinkButton;
if (hb != null && !string.IsNullOrEmpty(hb.Name))
{
if (name.Contains(hb.Name))
{
lp.Add(path);
}
}
}
}
}
for (int i = 0; i < lp.Count; i++)
{
canvas.Children.Remove(lp[i]);
}
}

}
}

运行效果: