网格中控件周围的 WPF 可单击区域

Posted

技术标签:

【中文标题】网格中控件周围的 WPF 可单击区域【英文标题】:WPF clickable area around controls in grid 【发布时间】:2013-05-08 03:44:11 【问题描述】:

我在为表单制作自定义标题栏时遇到问题。它将包含一个搜索文本框以及一些滑块,如下图所示: 现在,想象一下标题栏 - 不属于控件本身的所有内容(由边框元素和滑块包围的文本框)都需要鼠标按下以进行拖动。

我试过这个:

<Grid MouseDown="TitleGridMouseDown">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="135"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="200"/>
        </Grid.ColumnDefinitions>
        <Slider Grid.Column="1" Margin="5 15 5 0" Width="100"  MouseDown="TitleGridMouseDown"/>
        <Slider Grid.Column="2" Margin="5 15 5 0"/>
        <Border Grid.Column="3" CornerRadius="10" BorderThickness="1" BorderBrush="White" Width="180" Height="20" Background="White">
            <TextBox Background="Transparent" BorderThickness="0" Height="20"/>
        </Border>

    </Grid>

然而这无济于事。两个滑块之间有一小部分,例如几个像素区域,实际上是有效的(在事件本身中是 DragMove();)。我在 WPF 中没有太多此类事情的经验,但对我来说感觉就像该区域缩小到控件一样。例如,如果我将边框对象放入按钮并尝试将事件绑定到按钮,则不会发生任何变化。

我应该如何处理这个问题?

【问题讨论】:

你试过在Grid上使用PreviewMouseDown吗? 好的 PreviewMouseDown 实际上开始工作了。然而,它似乎具有禁用鼠标单击和拖动底层元素的功能的明显副作用......即我无法单击文本框或拖动滑块,因为它只是拖动窗口......嗯...... . 是的,我已经设法通过一些 hack 解决了这个问题。我在 Grid 中的完全相同的单元格中放置了一个矩形,给它透明填充,然后将 mousedown 事件附加到它上面。我不确定它是否有任何负面影响,它确实感觉像是一种黑客行为,但是......它可以正常工作,奇怪的是,完美无瑕。 【参考方案1】:

您的问题是您想在网格元素上捕获MouseDown 事件。由于您的网格没有设置背景,因此默认为空。 MouseDown 事件不会被引发。把它想象成它正在穿过网格而不实际击中它。顶部网格上的 Background=Transparent 应该可以解决问题。

【讨论】:

以上是关于网格中控件周围的 WPF 可单击区域的主要内容,如果未能解决你的问题,请参考以下文章

网格和stackpanel之间的WPF组合

如何创建可重用的 WPF 网格布局

在 WPF 数据网格、组合框模板列上单击编辑

同一用户控件的不同WPF网格行大小规格取决于情况

对 WPF 数据网格中的多列进行排序

如何在自定义 wpf 控件上绑定数据网格列的可见性?