在wpf C#中启用子图像鼠标事件时,禁用父自定义UserControl MouseEvent

问题描述

我正在使用Caliburn.Micro MVVM Framework在Wpf项目中工作。我有个问题 。我做了一个自定义用户控件来缩放图片。它具有MouseDown和MouseMove事件。该事件在另一个名称的“缩放边框”中。我在父Custom Made控件中有子图像。图像具有三个事件MouseDown,MouseMove和Mouse UP。因为我想计算不同点的坐标。我有一个menucontrol和2个选项Zoom和Image Measurement。当“缩放控制”菜单选择“我缩放图片”时,选择“图像测量”时,我计算图像的坐标。我尝试使用启用和禁用,但是当disbale父控件失灵时,我无法访问Child Event。所以我试图使用布尔值,但那也不起作用。您能给我个想法还是代码示例我该怎么做。这是我的代码...

    <utils:ZoomBorder x:Name="ZoomBorder" Visibility="{Binding Path=IsDiIMGVisible,Converter={StaticResource Converter}}"   IsEnabled="{Binding IsEnableZoom}"   ClipToBounds="True" Background="Gray" Grid.Row="3" Grid.Column="2" Grid.ColumnSpan="4">

        <Canvas Grid.Row="3" Grid.Column="2" Grid.ColumnSpan="4"  IsEnabled="{Binding IsEnableCanvas}"  Visibility="{Binding Path=ISCanvasVisible,Converter={StaticResource Converter}}">
            <Image Source="{Binding DIIMGFINAL}"    cal:Message.Attach="[Event MouseDown] = [Action MDowncalculatedistance($source,$eventArgs)];
                [Event MouseUp] = [Action MUpCalculatedistance($source,$eventArgs)];
                [Event MouseMove] = [Action MMoveCalculatedistance($source,$eventArgs)]"/>
            <Line IsHitTestVisible="False"  X1="{Binding FirstPoint.X}" Y1="{Binding FirstPoint.Y}"
                  X2="{Binding SecondPoint.X}" Y2="{Binding SecondPoint.Y}"
                  stroke="Red" strokeThickness="3"/>
        </Canvas>

    </utils:ZoomBorder>

这是我的ZoomBorder类

public class ZoomBorder : Border
{
    private UIElement child = null;
    private Point origin;
    private Point start;

    private TranslateTransform GetTranslateTransform(UIElement element)
    {
        return (TranslateTransform)((TransformGroup)element.RenderTransform)
          .Children.First(tr => tr is TranslateTransform);
    }

    private ScaleTransform GetScaleTransform(UIElement element)
    {
        return (ScaleTransform)((TransformGroup)element.RenderTransform)
          .Children.First(tr => tr is ScaleTransform);
    }

    public override UIElement Child
    {
        get { return base.Child; }
        set
        {
            if (value != null && value != this.Child)
                this.Initialize(value);
            base.Child = value;
        }
    }

    public void Initialize(UIElement element)
    {
        this.child = element;
        if (child != null)
        {
            TransformGroup group = new TransformGroup();
            ScaleTransform st = new ScaleTransform();
            group.Children.Add(st);
            TranslateTransform tt = new TranslateTransform();
            group.Children.Add(tt);
            child.RenderTransform = group;
            child.RenderTransformOrigin = new Point(0.0,0.0);
            this.MouseWheel += child_MouseWheel;
            this.MouseLeftButtonDown += child_MouseLeftButtonDown;
            this.MouseLeftButtonUp += child_MouseLeftButtonUp;
            this.MouseMove += child_MouseMove;
            this.PreviewMouseRightButtonDown += new MouseButtonEventHandler(
              child_PreviewMouseRightButtonDown);
        }
    }

    public void Reset()
    {
        if (child != null)
        {
            // reset zoom
            var st = GetScaleTransform(child);
            st.ScaleX = 1.0;
            st.ScaleY = 1.0;

            // reset pan
            var tt = GetTranslateTransform(child);
            tt.X = 0.0;
            tt.Y = 0.0;
        }
    }

    #region Child Events

    private void child_MouseWheel(object sender,MouseWheelEventArgs e)
    {
        if (child != null)
        {
            var st = GetScaleTransform(child);
            var tt = GetTranslateTransform(child);

            double zoom = e.Delta > 0 ? .2 : -.2;
            if (!(e.Delta > 0) && (st.ScaleX < .4 || st.ScaleY < .4))
                return;

            Point relative = e.GetPosition(child);
            double abosuluteX;
            double abosuluteY;

            abosuluteX = relative.X * st.ScaleX + tt.X;
            abosuluteY = relative.Y * st.ScaleY + tt.Y;

            st.ScaleX += zoom;
            st.ScaleY += zoom;

            tt.X = abosuluteX - relative.X * st.ScaleX;
            tt.Y = abosuluteY - relative.Y * st.ScaleY;
        }
    }

    private void child_MouseLeftButtonDown(object sender,MouseButtonEventArgs e)
    {
        if (child != null)
        {
            var tt = GetTranslateTransform(child);
            start = e.GetPosition(this);
            origin = new Point(tt.X,tt.Y);
            this.Cursor = Cursors.Hand;
            child.CaptureMouse();
        }
    }

    private void child_MouseLeftButtonUp(object sender,MouseButtonEventArgs e)
    {
        if (child != null)
        {
            child.ReleaseMouseCapture();
            this.Cursor = Cursors.Arrow;
        }
    }

    void child_PreviewMouseRightButtonDown(object sender,MouseButtonEventArgs e)
    {
        this.Reset();
    }

    private void child_MouseMove(object sender,MouseEventArgs e)
    {
        if (child != null)
        {
            if (child.IsMouseCaptured)
            {
                var tt = GetTranslateTransform(child);
                Vector v = start - e.GetPosition(this);
                tt.X = origin.X - v.X;
                tt.Y = origin.Y - v.Y;
            }
        }
    }

    #endregion
}

这里是用于增强缩放或图像计算的菜单控件

 <Menu Grid.ColumnSpan="3" Grid.Column="1" Grid.Row="0"  Background="Transparent" >
        <MenuItem x:Name="ZoomControl" Header="Zoom">
            <!--Item For Zoom-->
        </MenuItem>

        <MenuItem x:Name="Img_Measurement" Header="Image Measurement">
            <!--Item For Measure-->
        </MenuItem>
    </Menu>

这与菜单对应的事件

   public void ZoomControl()
    {
        //For Only Zoom
        ISCanvasVisible = false;
        IsDiIMGVisible = true;
        IsEnableZoom = true;
        IsEnableCanvas = false;
        disTanceInMM = 0;
        MessageBox.Show("Zoom Control Starts","Alert",MessageBoxButton.OK,MessageBoxImage.Exclamation);
    }

    public void Img_Measurement()
    {
        //IsDiIMGVisible = false;
       
        IsDiIMGVisible = false;
        ISCanvasVisible = true;
        IsEnableZoom = false;
        IsEnableCanvas = true;
        MessageBox.Show("Image Measurement Starts",MessageBoxImage.Exclamation);
    }

这是我按下鼠标,向上移动鼠标的图像事件

 public void MDowncalculatedistance(object sender,System.Windows.Input.MouseEventArgs e)
    {
       if (IsEnableCanvas == false) return;

        if (!(sender is System.Windows.Controls.Image)) return;

        else if (IsEnableCanvas == true){}
        try{
            //Code Here
        }
        Catch(Exception ex){
            //code here
        }
    }
    }

     public void MUpCalculatedistance(object sender,System.Windows.Input.MouseEventArgs e)
    {
      if (ISCanvasVisible == false) return;
        _firstPoint = new System.Windows.Point(0,0);
        _secondPoint = new System.Windows.Point(0,0);
    }
     public void MMoveCalculatedistance(object sender,System.Windows.Input.MouseEventArgs e) //Mouse Move Event
    {
        if (ISCanvasVisible == false) return;
        if (!(sender is System.Windows.Controls.Image)) return;

        try
        {
            //Code Here
        }
        catch(Exception ex){
            //Code
        }
    }

我认为在Zoomborder类中,我需要通过,但是您能如何帮助我。提前致谢。我对在enable child control while Custom parent is disabled in wpf C#中启用和禁用功能提出了疑问,但是我认为我可以在ZoomBorder中传递一些值,并且只能禁用它。可以吗

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...