C# 用于向前和向后发送的WPF上下文菜单控件

C# 用于向前和向后发送的WPF上下文菜单控件,c#,wpf,user-controls,contextmenu,z-order,C#,Wpf,User Controls,Contextmenu,Z Order,我希望这里的问题其实很简单 我在WPF中有一个自定义UserControl,它允许我显示图像。当程序运行时,用户可以将此UserControl添加到画布中任意次数。实际上是一个简单的图像查看器,用户可以在其中添加和移动图像 我想能够右键单击这些图像打开一个上下文菜单,然后选择“向前发送”或“向后发送”,然后图像将根据单击的菜单选项更改z顺序 我用contextMenu设置了用户控件,所以我只需要知道更改此用户控件z顺序的代码 非常感谢您的帮助:) 名称空间故事板工具 { /// ///Cust

我希望这里的问题其实很简单

我在WPF中有一个自定义UserControl,它允许我显示图像。当程序运行时,用户可以将此UserControl添加到画布中任意次数。实际上是一个简单的图像查看器,用户可以在其中添加和移动图像

我想能够右键单击这些图像打开一个上下文菜单,然后选择“向前发送”或“向后发送”,然后图像将根据单击的菜单选项更改z顺序

我用contextMenu设置了用户控件,所以我只需要知道更改此用户控件z顺序的代码

非常感谢您的帮助:)

名称空间故事板工具
{
/// 
///CustomImage.xaml的交互逻辑
/// 
公共部分类CustomImage:UserControl
{
私人点鼠标点击;
私人双拉票;
私人双坎瓦斯托普酒店;
公众形象(
{
初始化组件();
cusImageControl.SetValue(Canvas.LeftProperty,0.0);
cusImageControl.SetValue(Canvas.TopProperty,0.0);
}
公共无效选择图像()
{
OpenFileDialog ofd=新建OpenFileDialog();
ofd.Title=“选择要添加的图像”;
if(ofd.ShowDialog()==true)
{
BitmapImage bImage=新的BitmapImage();
bImage.BeginInit();
bImage.UriSource=新Uri(ofd.FileName);
bImage.EndInit();
image.Width=bImage.Width;
image.Height=bImage.Height;
image.Source=bImage;
image.Stretch=Stretch.Fill;
}
}
私有void cusImageControl_LostMouseCapture(对象发送器,MouseEventArgs e)
{
((自定义图像)发送者)。释放鼠标许可();
}
私有void cusImageControl_MouseUp(对象发送器,MouseButtonEventArgs e)
{
((自定义图像)发送者)。释放鼠标许可();
cusImageControl.Cursor=Cursors.Arrow;
}
私有void cusImageControl_MouseMove(对象发送方,MouseEventArgs e)
{
if((((CustomImage)sender.IsMouseCaptured)和&(cusImageControl.Cursor==Cursors.SizeAll))
{
点mouseCurrent=e.GetPosition(null);
左双=mouseCurrent.X-mouseClick.X;
double-Top=mouseCurrent.Y-mouseClick.Y;
mouseClick=e.GetPosition(null);
((CustomImage)sender).SetValue(Canvas.LeftProperty,canvasLeft+Left);
((CustomImage)sender).SetValue(Canvas.TopProperty,canvasTop+Top);
canvasleet=Canvas.GetLeft(((CustomImage)sender));
canvasTop=Canvas.GetTop(((CustomImage)sender));
}
else if((((CustomImage)sender.IsMouseCaptured)和&(cusImageControl.Cursor==Cursors.SizeNWSE))
{
/*点mouseCurrent=e.GetPosition(null);
cusImageControl.Height=cusImageControl.canvasTop+mouseClick.Y;
cusImageControl.Width=cusImageControl.canvasLeft+mouseClick.X;
mouseClick=e.GetPosition(null)*/
}
}
私有void cusImageControl_MouseDown(对象发送器,MouseButtonEventArgs e)
{
mouseClick=e.GetPosition(null);
canvasleet=Canvas.GetLeft(((CustomImage)sender));
canvasTop=Canvas.GetTop(((CustomImage)sender));
((CustomImage)sender.CaptureMouse();
}
private void ContextMenubring Forward_Click(对象发送方,路由目标)
{
MessageBox.Show(“向前推进”);
}
private void ContextMenuSendBackward_单击(对象发送方,路由目标)
{
MessageBox.Show(“向后发送”);
}
私有无效上下文移动\单击(对象发送方,路由目标)
{
cusImageControl.Cursor=Cursors.SizeAll;
}   
private void ContextMenuResize_单击(对象发送方,路由目标)
{
cusImageControl.Cursor=Cursors.SizeNWSE;
}
}
}

请参见面板附加属性。将所有元素的z索引更改为0,右键单击控件的z索引更改为1

void mouseUp(object sender, MouseButtonEventArgs e)
{
   foreach (var child in yourCanvas.Children) Canvas.SetZIndex(child, 0); 
   Canvas.SetZIndex((UIElement)sender, 1);
}

以下代码适用于定义为my UserControl并在mouseDown事件中设置的selected

private void ContextMenuSendBackward_Click(object sender, RoutedEventArgs e)
        {
            Canvas parent = (Canvas)LogicalTreeHelper.GetParent(this);
            foreach (var child in parent.Children)
            {
                Canvas.SetZIndex((UIElement)child, 0);
            }
            Canvas.SetZIndex(selected, 1);
        }

感谢voo的帮助。

@kev3kev3我添加了代码示例。是的,在您的click事件处理程序中,将z-index设置为all children为0,并将z-index设置为sender userControls为1感谢您的响应,我遇到的问题是,由于userControls在运行时动态添加到画布中,我无法访问yourCanvas.children属性。有办法解决这个问题吗?为什么没有?yourCanvas.Children集合会影响动态添加或不添加的子控件上的更改可能我缺少一些东西我将发布我的UserControls的代码您可以使用LogicalTreeHelper.GetParent(此)获取UserControls的父控件,该控件假定为画布。并使用此对象进行操作移动Canvas.SetZIndex(选中,1);圈外
private void ContextMenuSendBackward_Click(object sender, RoutedEventArgs e)
        {
            Canvas parent = (Canvas)LogicalTreeHelper.GetParent(this);
            foreach (var child in parent.Children)
            {
                Canvas.SetZIndex((UIElement)child, 0);
            }
            Canvas.SetZIndex(selected, 1);
        }