您的位置:首页 > 其它

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

2010-03-10 14:03 555 查看

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]);
}
}

}
}

运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐