为什么 Canvas wpf 无法检测到点击?

Mos*_*ico 1 c# wpf canvas mouseevent

这是我的 XAML

<Window x:Class="Drawing.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <TextBox Grid.Row="0" Height="25" IsEnabled="False" Name="txt"/>
    <Canvas Name="cnv" MouseLeftButtonDown="cnv_MouseLeftButtonDown" Grid.Row="1"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

...这是我的 C# 代码

private void cnv_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Point p = Mouse.GetPosition(cnv);
    p.X += cnv.Margin.Left;
    p.Y += cnv.Margin.Top;
    txt.Text = p.ToString();
}
Run Code Online (Sandbox Code Playgroud)

问题 :

  1. 即使我单击画布,该事件也没有触发。我想知道为什么?有什么我错过的吗?
  2. 在这段代码中,我没有包含任何画布边距,但由于我想稍后使用边距,是否有必要添加带有边距的点击位置以获得正确的值?

谢谢。

dko*_*ozl 5

Canvas永远不会根据内容自动调整其大小,即使它这样做,您的案例中也没有内容,因此请删除Height="Auto"并让它填充所有可用空间。第二个问题是Background不会Canvas被初始化(默认空值),因此它不会在命中测试中可见。您需要初始化Background一些东西,Transparent例如

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" Height="25" IsEnabled="False" Name="txt"/>
    <Canvas Name="cnv" MouseLeftButtonDown="cnv_MouseLeftButtonDown" Grid.Row="1" Background="Transparent"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

编辑

至于第二个问题。当您这样做时,GetPosition您指定相对于哪个元素(在您的情况下您传递cnv),因此如果您要更改Margincnv会将您的位置返回到 区域的左上角CanvasMargin您可以通过将和更改为红色来测试它Background,例如,Canvas单击红色矩形的左上角,并且Mouse.GetPosition(cnv)始终返回接近于零的值(无论边距是多少)