5

我有一个Button

<Button>
    <Button.Template>
        <ControlTemplate>
            <StackPanel>
                <Image Source="share.png" 
                       MouseLeftButtonUp="Image_MouseLeftButtonUp"
                       MouseLeftButtonDown="Image_MouseLeftButtonDown" />
            </StackPanel>
        </ControlTemplate>
    </Button.Template>
</Button>

但问题是,与 MouseLeftButtonDown 不同,事件 MouseLeftButtonUp 不会触发。为什么?我该如何解决?谢谢。

4

3 回答 3

9

可能是因为Button它已经在处理事件,所以它不会过滤到 Image 控件。

为什么要在 上处理 MoustUp 和 MouseDown 事件Image?为什么不处理它们Button

编辑
快速查看此事件的文档后,我发现MouseLeftButtonUp的路由策略是Direct,但实际的底层事件是具有Bubbling策略的MouseUp事件。因此,实际上,应该有一个事实上的冒泡策略,这意味着应该有机会在.MouseLeftButtonUpImageButton

听起来可能还有其他事情发生。如果您在 Image 控件上将 Image 设置为空,并且背景为 null(不同于Color.Transparent),则 WPF 会将控件视为不“存在”,就鼠标事件而言。

编辑 2
嗯……也许我最初的猜测是正确的。根据此线程:
http
Button ://social.msdn.microsoft.com/forums/en/wpf/thread/e231919d-9fef-4aa5-9dcb-2c1eb68df25b/#306db880-ed50-45d2-819f-88d76f7148c1正在处理该MouseUp事件。尝试使用PreviewMouseUp,然后检查单击了哪个按钮。

编辑 3
好的...我想我想通了。我打赌 Button 在 MouseDown 事件中“捕获”了鼠标。发生这种情况时,其他控件将不会收到 MouseUp 或 MouseDown 事件(包括预览版),直到鼠标被释放。
请参阅:http: //books.google.com/books ?id=nYl7J7z3KssC&pg=PA146#v=twopage&q&f=true

于 2012-09-19T14:01:14.293 回答
5

正如 Cyborgx37 所说,Click 事件正在处理 LeftMouseUp 事件。

您可以在 Button 上使用PreviewMouseLeftButtonUp事件而不是 , ,如下所示:MouseLeftButtonUp

<Button PreviewMouseLeftButtonUp="Button_PreviewMouseLeftButtonUp">
    <Button.Template>
        <ControlTemplate>
            <StackPanel>
                <Image Source="..." />
            </StackPanel>
        </ControlTemplate>
    </Button.Template>
</Button>

你的 Button 模板只有一个 Image,我猜你不需要这个 Button,你可以像上面那样使用,这样你就可以捕获 MouseLeftUp 事件。

<Image MouseLeftButtonUp="Image_MouseLeftButtonUp" Source="..." />

这种方式要容易得多,但这取决于您的需要。

顺便说一句,对不起我的废话英语,我希望它可以帮助你。

于 2012-09-19T14:32:14.963 回答
0

尝试使用事件 PreviewMouseLeftButtonUp。

于 2012-09-19T14:38:59.383 回答