【问题标题】:WPF: Canvas swallowing MouseDownEvent?WPF:画布吞噬 MouseDownEvent?
【发布时间】:2013-04-19 08:02:29
【问题描述】:

谁能在这个简单的例子中向我解释为什么MouseDownevent 没有到达ScrollViewer

<Window x:Class="MouseDownTest.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>
        <ScrollViewer Name="scrollViewer" Background="Green" MouseDown="ScrollViewer_MouseDown" PreviewMouseDown="ScrollViewer_PreviewMouseDown">
            <Canvas Name="canvas" Background="Beige" MouseDown="Canvas_MouseDown" PreviewMouseDown="Canvas_PreviewMouseDown">
            </Canvas>
        </ScrollViewer>
    </Grid>
</Window>

后面的代码:

using System;
using System.Windows;
using System.Windows.Input;

namespace MouseDownTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            scrollViewer.AddHandler(MouseDownEvent, new RoutedEventHandler(ScrollViewer_Test));
        }

        private void ScrollViewer_Test(object sender, RoutedEventArgs routedEventArgs)
        {
            Console.WriteLine("ScrollViewer_Test");
        }

        private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("Canvas_MouseDown");
        }

        private void Canvas_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("Canvas_PreviewMouseDown");
        }

        private void ScrollViewer_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("ScrollViewer_MouseDown");
        }

        private void ScrollViewer_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("ScrollViewer_PreviewMouseDown");
        }
    }
}

点击画布时的输出是

ScrollViewer_PreviewMouseDown
Canvas_PreviewMouseDown
Canvas_MouseDown

为什么ScrollViewer_MouseDown被省略了?我已经查看了this article,但那里给出的解决方案没有帮助(或者我做错了)。

【问题讨论】:

    标签: c# wpf canvas scrollviewer mousedown


    【解决方案1】:

    您可能需要在ScrollViewer 上设置Focusable="False" 以允许鼠标事件通过

     <ScrollViewer Name="scrollViewer" Focusable="False" Background="Green" />
    

    输出:

    ScrollViewer_PreviewMouseDown
    Canvas_PreviewMouseDown
    Canvas_MouseDown
    ScrollViewer_MouseDown
    

    【讨论】:

    • 哇,这似乎可行,谢谢!虽然在ScrollViewer上设置一个属性似乎有点奇怪,因为Canvas似乎吞噬了这个事件......
    • 是的,我不知道为什么,但我认为它与 ScrollViewer 的默认行为有关,我认为它吞下事件以集中其内容,也许,只是一个猜测。LOL
    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 2018-05-18
    • 2016-04-23
    • 2012-05-15
    • 2011-10-05
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多