반응형

Image img = new Image();
img.Source = new BitmapImage(new Uri(“pack://application:,,,/Assambly Name;component/Resources/aaa.png”, UriKind.RelativeOrAbsolute));

반응형

'C# 개발 > WPF' 카테고리의 다른 글

WPF에서 UserControl 마우스로 이동 처리 방법  (0) 2021.06.29
Observable Collection에서 Item 찾기  (0) 2019.01.10
C1 DataGrid 필터링 설정  (0) 2019.01.07
반응형

사용자 컨트롤을 마우스 좌측 버튼을 눌러서 이동시키고자 할 경우 유용하게 사용할 수 있는 코드이다.

MemoViewControl 클래스는 내가 만든 사용자 컨트롤이며, 이 컨트롤을 선택해서 마우스로 선택/이동 하는 기능을 수행한다.

MemoViewControl 부분을 각자가 만든 UserControl로 바꾸어서 사용하면 된다.

MemoViewControl에 대한 마우스 Down/Up/Move 이벤트를 아래와 같이 처리해서 사용하면 된다.

        private object movingObject;
        private double firstXPos, firstYPos;

        private void MemoView_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed && sender == movingObject)
            {
                MemoViewControl memoCtnl = sender as MemoViewControl;
                Canvas canvas = memoCtnl.Parent as Canvas;
                // Horizontal
                double newLeft = e.GetPosition(canvas).X - firstXPos - canvas.Margin.Left;
                // newLeft inside canvas right-border?
                if (newLeft > canvas.Margin.Left + canvas.ActualWidth - memoCtnl.ActualWidth)
                    newLeft = canvas.Margin.Left + canvas.ActualWidth - memoCtnl.ActualWidth;
                // newLeft inside canvas left-border?
                else if (newLeft < canvas.Margin.Left)
                    newLeft = canvas.Margin.Left;

                memoCtnl.SetValue(Canvas.LeftProperty, newLeft);

                //Vertical
                double newTop = e.GetPosition(canvas).Y - firstYPos - canvas.Margin.Top;
                // newTop inside canvas bottom-border?
                // -- Bottom --
                if (newTop > canvas.Margin.Top + canvas.ActualHeight - memoCtnl.ActualHeight)
                    newTop = canvas.Margin.Top + canvas.ActualHeight - memoCtnl.ActualHeight;
                // newTop inside canvas top-border?
                // -- Top --
                else if (newTop < canvas.Margin.Top)
                    newTop = canvas.Margin.Top;

                memoCtnl.SetValue(Canvas.TopProperty, newTop);
            }
        }

        private void MemoView_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            selectMemo = (MemoViewControl)sender;
            Canvas canvas = selectMemo.Parent as Canvas;

            movingObject = null;
            
            Mouse.Capture(selectMemo);
        }              

        private void MemoView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {            
            selectMemo = (MemoViewControl) sender;
            Canvas canvas = selectMemo.Parent as Canvas;

            firstXPos = e.GetPosition(selectMemo).X;
            firstYPos = e.GetPosition(selectMemo).Y;

            movingObject = sender;            
            Mouse.Capture(null);
        }

 

 

반응형

'C# 개발 > WPF' 카테고리의 다른 글

WPF에서 리소스에 등록된 이미지 가져오기  (0) 2021.08.23
Observable Collection에서 Item 찾기  (0) 2019.01.10
C1 DataGrid 필터링 설정  (0) 2019.01.07
반응형

마우스 Move 또는 Left Button Click 시에 마우스 포인트가 어떠한 선 위에 있는지를 체크하는 방법이다.

하기의 코드에 문제가 있거나, 개선이 필요한 부분이 있다면 의견 주시면 감사하겠습니다.

 

 

Function의 첫번째 파라미터는 선의 시작 포인트, 두번째 파라미터는 선의 종료 포인트, 세번째 파라미터는 마우스의 포인트를 말한다.

    public static bool CheckPointOnLine(Point startP, Point endP, Point point)
    {
        bool check = false;

        double dx = endP.X - startP.X;
        double dy = endP.Y - startP.Y;
        double dx1 = point.X - startP.X;
        double dy1 = point.Y - startP.Y;
        double a = 0, b = 0, c = 0;

        if (Math.Abs(dx) > 0 && Math.Abs(dy) < Math.Abs(dx))
        {
            if (dx * dx1 >= 0 && Math.Abs(dx1) <= Math.Abs(dx))
            {
                a = (dy * dx1);
                b = (dx * dy1);
                c = Math.Abs(dx * 5);
                if (Math.Abs(a - b) <= c)
                {
                    check = true;
                }
            }
        }
        else if (Math.Abs(dy) > 0)
        {
            if (dy * dy1 >= 0 && (Math.Abs(dy1) <= Math.Abs(dy)))
            {
                a = (dx * dy1);
                b = (dy * dx1);
                c = Math.Abs(dy * 5);
                if (Math.Abs(a - b) <= c)
                {
                    if (Math.Abs(a - b) <= c)
                    {
                        check = true;
                    }
                }
            }
        }

        return check;
    }

 

반응형

+ Recent posts