在 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自定义控件加载到主窗体中之后,自定控件上面的空间 怎么和主窗体上其他控件交互?
带有 org.springframework.cloud 和 spring-boot-starter-parent 的自定义父 pom