Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我需要在网格上使用背景色才能使按钮事件正常工作?_C#_Wpf_Wpf Controls - Fatal编程技术网

C# 为什么我需要在网格上使用背景色才能使按钮事件正常工作?

C# 为什么我需要在网格上使用背景色才能使按钮事件正常工作?,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,为什么网格、StackPanel等需要有背景才能使MouseDown事件正常工作?如果我不设置背景,那么连接到单击鼠标按钮的事件将根本不会触发。将背景设置为均匀的透明颜色后,它开始正常工作 该解决方案的目的是什么?是不是有什么“幕后”发生的事我不知道?背景设置的改变不仅仅是背景吗?如果你不设置背景,你会点击它,它下面的元素(可能是窗口)将获得事件。我相信这是一个前提的结果,即如果元素在屏幕上不可见,用户不会期望它被点击 “空”空间不应反应 当然也有例外,比如列表框项目,即使你没有实际点击一封信,

为什么网格、StackPanel等需要有背景才能使MouseDown事件正常工作?如果我不设置背景,那么连接到单击鼠标按钮的事件将根本不会触发。将背景设置为均匀的透明颜色后,它开始正常工作


该解决方案的目的是什么?是不是有什么“幕后”发生的事我不知道?背景设置的改变不仅仅是背景吗?

如果你不设置背景,你会点击它,它下面的元素(可能是窗口)将获得事件。

我相信这是一个前提的结果,即如果元素在屏幕上不可见,用户不会期望它被点击

“空”空间不应反应

当然也有例外,比如列表框项目,即使你没有实际点击一封信,你也希望有一个反应,但在它们之间。在这里,列表框项的模板有一个透明的边框,可以捕捉鼠标事件,即使用户错过了“正确”的目标


所以基本上,WPF为您提供了一种机制来控制什么是命中测试可见的,什么是不可见的,并且不会影响子项的行为。而且它只是一个
Background=“Transparent”

为了不点击,将背景色的
a
属性设置为0%。你可以在控件的属性中这样做,点击背景,你会看到R,G,B,A

<Button Content="OK" Background="#00000000" Width="150"/>

现在,您可以使用透明颜色并捕获所有事件(而不是单击)


注意,最初我将颜色设置为黑色(R=0,G=0,B=0)。更改A将把原始颜色更改为十六进制表示法,但这并不重要,因为您可以选择任何颜色并使其看起来透明。

这是否解释了
透明的原因?而
Color
是一个结构,所以它必须有一个值。那么你怎么能不提供一个值呢?背景不是颜色,而是画笔。如果您给它一个颜色名称,XAML的笔刷构造函数将创建一个。因此,传递透明将创建一个具有透明颜色的实心笔刷,不设置背景将意味着您根本没有笔刷。@Clemens,啊,在WinForms中,它是一种颜色。我不知道它在WPF中发生了变化。@gunr2171您甚至不能说有什么变化,因为WPF与WinForms完全无关。我理解。。。但是为什么画笔与事件有任何关联呢?真正的问题是你为什么要在
面板中开始
MouseDown
操作。这就是按钮(和其他非基于
面板的UI元素)的用途。发布相关的XAML和所需内容的屏幕截图。查看MSDN:。@HighCore:上的这篇文章,似乎没有必要对此提出质疑。我至少可以想到一个有效的用例:开发人员正在创建一个没有标题栏的窗口,但他希望允许用户通过单击窗口上的任意位置来拖动它。我在闪屏上看过很多。