在 wpf C# 中禁用自定义父项时启用子控件

Posted

技术标签:

【中文标题】在 wpf C# 中禁用自定义父项时启用子控件【英文标题】:enable child control while Custom parent is disabled in wpf C# 【发布时间】:2021-01-09 17:47:20 【问题描述】:

您好,我为缩放图片制作了定制的父控件。在那个 Control 里面有子画布,在 Canvas 里面有子图像 Control 。我创建了缩放和图像测量菜单。我也可以测量坐标图像。我禁用 Parent ZoomBorder 控件时的问题我无法触发 Child Image 的事件。我可以禁用名为 ZoomBorder 的 ZoomControl 但我想要 MouseDown 的图像事件。启用 Zoomcontrol 并且它可以工作时,我可以禁用子图像事件。 这是我的代码。

<utils:ZoomBorder x:Name="ZoomBorder"   IsEnabled="Binding IsEnableZoom"   ClipToBounds="True" Background="Gray" Grid.Row="3" Grid.Column="2" Grid.ColumnSpan="4">
        <Canvas IsEnabled="Binding IsEnableCanvas">
            <Image  x:Name="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>

这是菜单项 ImageMeasuring 和 Zoom

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

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

这是我用于 Zoom 激活的 C# 代码

  public void ズームControl()
    
        //For Only Zoom
        IsEnableZoom = true;
        IsEnableCanvas = false;
        MessageBox.Show("Zoom Control Starts", "Alert", MessageBoxButton.OK, MessageBoxImage.Exclamation);
    

这是图像测量

 public void Img_Measurement()
    
        IsEnableZoom = false;
        IsEnableCanvas = true;
        MessageBox.Show("Image Measurement Starts", "Alert", MessageBoxButton.OK, MessageBoxImage.Exclamation);
    

Here Is My Image MouseDown 事件

public void MDownCalCulateDistance(object sender, System.Windows.Input.MouseEventArgs e)
    
         f (IsEnableCanvas == false) return;

        if (!(sender is System.Windows.Controls.Image)) return;
        try
            //Code Here
        
        Catch(Exception ex)
            //code here
        
    

这是用于启用的属性

 public bool IsEnableZoom
    
        get
        
            return _isEnableZoom;
        
        set
        

            _isEnableZoom = value;
            NotifyOfPropertyChange(() => IsEnableZoom);
        
    

    public bool IsEnableCanvas
    
        get
        
            return _isEnableCanvas;
        
        set
        

            _isEnableCanvas = value;
            NotifyOfPropertyChange(() => IsEnableCanvas);
        
    

如您所见,当我禁用 ZoomControl 的 ZoomBorder 时,我无法执行 MouseDown 事件。当启用父事件的 ZoomBorder 时,我可以禁用 Mousedown。请帮我 。提前致谢

【问题讨论】:

【参考方案1】:

禁用的元素不会引发鼠标事件。这是设计使然。

来自docs:

未启用的元素不参与命中测试或焦点,因此不会成为输入事件的来源。

显而易见的解决方案是不要禁用Canvas。您仍然可以让它看起来和/或表现得像被禁用一样。

【讨论】:

我想在禁用父控件但启用子控件时引发事件。然后 。可以吗 当您禁用 Canvas 时,它的子代也被禁用。所以子控件没有启用。 但是我想启用子控件可以吗.... 不,您不能启用已禁用 Canvas 的子控件。

以上是关于在 wpf C# 中禁用自定义父项时启用子控件的主要内容,如果未能解决你的问题,请参考以下文章

spring boot2.0一看就会的超详细快速入门-自定义父POM

C# Winform自定义控件加载到主窗体中之后,自定控件上面的空间 怎么和主窗体上其他控件交互?

具有自定义父级的 Spring Boot 父级 pom

带有 org.springframework.cloud 和 spring-boot-starter-parent 的自定义父 pom

是否可以创建一个 spring-boot 自定义父 pom 这也是一个多模块项目?

使用 JSP 和 POM 中的自定义父集从 Spring Boot MVC 项目中创建一个可执行的 jar 服务内容