2013-07-18 1 views
0

여기 내가 원하는 바가있는 문제는 실제로 간단합니다.WPF contextMenu 앞으로 가져 오기 및 뒤로 보내기

이미지를 표시 할 수있는 WPF에서 사용자 지정 UserControl이 있습니다. 프로그램이 실행 중일 때 사용자는 캔버스에 원하는만큼이 UserControl을 여러 번 추가 할 수 있습니다. 실제로 이미지를 추가하고 이동할 수있는 간단한 이미지 뷰어입니다.

이 이미지를 마우스 오른쪽 버튼으로 클릭하여 contextMenu를 열고 앞으로 가져 오기를 선택하면 이미지가 클릭 된 메뉴에 따라 z 순서가 변경됩니다. 나는 contextMenu를 사용하여 설정 사용자가 제어 할 수 있습니다

그래서 난 그냥 어떤 도움이 많이 감사합니다 :)

namespace StoryboardTool 
{ 
    /// <summary> 
    /// Interaction logic for CustomImage.xaml 
    /// </summary> 
    public partial class CustomImage : UserControl 
    { 
     private Point mouseClick; 
     private double canvasLeft; 
     private double canvasTop; 

     public CustomImage() 
     { 
      InitializeComponent(); 
      cusImageControl.SetValue(Canvas.LeftProperty, 0.0); 
      cusImageControl.SetValue(Canvas.TopProperty, 0.0); 
     } 

     public void chooseImage() 
     { 
      OpenFileDialog ofd = new OpenFileDialog(); 
      ofd.Title = "Choose Image to Add"; 

      if (ofd.ShowDialog() == true) 
      { 
       BitmapImage bImage = new BitmapImage(); 
       bImage.BeginInit(); 
       bImage.UriSource = new Uri(ofd.FileName); 
       bImage.EndInit(); 

       image.Width = bImage.Width; 
       image.Height = bImage.Height; 
       image.Source = bImage; 
       image.Stretch = Stretch.Fill; 
      } 
     } 

     private void cusImageControl_LostMouseCapture(object sender, MouseEventArgs e) 
     { 
      ((CustomImage)sender).ReleaseMouseCapture(); 
     } 

     private void cusImageControl_MouseUp(object sender, MouseButtonEventArgs e) 
     { 
      ((CustomImage)sender).ReleaseMouseCapture(); 
      cusImageControl.Cursor = Cursors.Arrow; 
     } 

     private void cusImageControl_MouseMove(object sender, MouseEventArgs e) 
     { 
      if ((((CustomImage)sender).IsMouseCaptured) && (cusImageControl.Cursor == Cursors.SizeAll)) 
      { 

       Point mouseCurrent = e.GetPosition(null); 
       double Left = 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); 
       canvasLeft = Canvas.GetLeft(((CustomImage)sender)); 
       canvasTop = Canvas.GetTop(((CustomImage)sender)); 

      } 
      else if ((((CustomImage)sender).IsMouseCaptured) && (cusImageControl.Cursor == Cursors.SizeNWSE)) 
      { 
       /*Point mouseCurrent = e.GetPosition(null); 
       cusImageControl.Height = cusImageControl.canvasTop + mouseClick.Y; 
       cusImageControl.Width = cusImageControl.canvasLeft + mouseClick.X; 
       mouseClick = e.GetPosition(null);*/ 

      } 
     } 

     private void cusImageControl_MouseDown(object sender, MouseButtonEventArgs e) 
     { 
      mouseClick = e.GetPosition(null); 
      canvasLeft = Canvas.GetLeft(((CustomImage)sender)); 
      canvasTop = Canvas.GetTop(((CustomImage)sender)); 
      ((CustomImage)sender).CaptureMouse(); 
     } 

     private void ContextMenuBringForward_Click(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show("Bring Forward"); 

     } 

     private void ContextMenuSendBackward_Click(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show("Send Backward"); 
     } 

     private void ContextMenuMove_Click(object sender, RoutedEventArgs e) 
     { 
      cusImageControl.Cursor = Cursors.SizeAll; 
     } 

     private void ContextMenuResize_Click(object sender, RoutedEventArgs e) 
     { 
      cusImageControl.Cursor = Cursors.SizeNWSE; 
     } 

    } 
} 

답변

0

로 마우스 오른쪽 버튼으로 클릭 한 컨트롤의 Z-인덱스입니다.

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에게 감사드립니다.

+0

Canvas.SetZIndex를 이동하십시오 (selected, 1); 루프 외부 – Alex

1
...이있는 UserControl의 z 순서를 변경하는 코드를 알고

필요

패널 첨부 속성 Canvas.SetZIndex을 참조하십시오. 0 모든 요소의 Z- 인덱스를 변경하고 내 UserControl을 정의하고 mouseDown 이벤트에 설정되어있는 경우 선택한 다음 코드는 작동 1.

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

@ kev3kev3 코드 예제를 추가했습니다. 예, 귀하의 클릭 이벤트 처리기에서 0으로 모든 어린이 Z - 색인을 설정하고 보낸 사람에게 1로 z- 색인을 설정 UserControl – Alex

+0

응답 주셔서 감사합니다, 나는 userControls가 런타임에 캔버스에 동적으로 추가되기 때문에 문제가 있습니다. yourCanvas.Children 속성에 대한 액세스 권한이 없습니다. 이 문제를 해결할 방법이 있습니까? – kev3kev3

+0

왜 안 되니? yourCanvas.Children 컬렉션은 동적으로 추가 된 어린이 중 하나의 변경에 영향을 미칩니다. – Alex