WPF:如何使用透明画布和可点击子项制作覆盖控件

Posted

技术标签:

【中文标题】WPF:如何使用透明画布和可点击子项制作覆盖控件【英文标题】:WPF: How to make an overlay control with transparent canvas and clickable child 【发布时间】:2011-12-12 05:13:24 【问题描述】:

我想制作一个将用作叠加层的自定义控件。该控件应该包含几个子控件,这些子控件应该被绘制并且应该像往常一样可以点击。但控件中的所有其他内容都应该是透明的并且“可点击”。

这是我尝试实现此目的的方法...首先,我在要放置叠加层的窗口中使用 PreviewMouseDown\Up\Move 事件。我希望这些事件“通过”我的自定义控件的透明部分,但在不透明处停止(例如在我的按钮处)。其次,这是我的控件的 xaml(根 UserControl 节点保持不变):

<Canvas Background="transparent" IsHitTestVisible="true">
     <Button Canvas.Left="384" Canvas.Top="34" Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" IsHitTestVisible="True" />
     <TextBlock Canvas.Left="27" Canvas.Top="105" Height="36" Name="textBlock1" Text="TextBlock" Width="432" FontSize="24" IsHitTestVisible="False" Foreground="Red" FontWeight="Bold" />
</Canvas>

但是,如果我将 Canvas 的 IsHitTestVisible 设置为 false,则包括按钮在内的整个控件将变为“不可点击”。如果将其设置为 true,我的所有隧道事件都会在自定义控件处停止,并且按钮变得不可点击。

实现这种行为的正确方法是什么? 是否可以在没有子类化画布(或任何其他面板)的情况下这样做?

【问题讨论】:

【参考方案1】:

您应该将Canvas 的背景设置为null(或者只是没有背景,null 是默认设置)。 Transparent 对鼠标点击是“可见的”。

【讨论】:

@Vlad,嗨,很高兴再次见到你!它是否有效,当背景为空时意味着无法单击内部按钮,但是,当背景透明时意味着可以单击按钮? /// 顺便说一句,非常感谢您之前的帮助。我的意思是 TextHighlightBlock 控件(黄色/橙色突出显示颜色)。你帮我做的很快。我公司的很多人告诉我,这项工作做得很好,这个控制是其中的重要组成部分。 @AndreyK.:嗯,没有硬性规定。有背景的面板(白色或红色或透明,无所谓)参与命中测试。所以鼠标事件可以传递到这样的面板。具有null(即否)背景的面板不参与命中测试过程。对于正常事件,命中测试从内部控件到外部控件(因此即使画布的背景设置为透明,单击按钮也有效),但对于预览事件,反之亦然,这就是 OP 出现问题的原因。跨度>

以上是关于WPF:如何使用透明画布和可点击子项制作覆盖控件的主要内容,如果未能解决你的问题,请参考以下文章

WPF 全透明 + 不可点击

裁剪 WPF 控件

如何使用 C# 在画布上的 WPF 中绘制透明 PNG

WPF中,如何点击一个被image覆盖住的控件。

如何修复 WPF 控件的简单 MouseOver 动画?

WPF C#如何使用鼠标使控件可拖动