MouseLeftButtonUp不会触发

时间:2012-09-19 13:53:57

标签: c# wpf events button mouseevent

我有Button

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

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

3 个答案:

答案 0 :(得分:8)

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

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

修改
在快速查看此活动的文档后,我发现MouseLeftButtonUp的路由策略为Direct,但实际的基础事件是MouseUp事件,其Bubbling策略。因此,实际上,MouseLeftButtonUp应该有一个事实上的冒泡策略,这意味着Image应该有机会在Button之前处理事件。

听起来像其他东西可能正在发生。如果在Image控件上将Image设置为nothing,并且背景为null(与Color.Transparent不同),那么就鼠标事件而言,WPF会将控件视为“不存在”。

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

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

答案 1 :(得分:4)

Click事件正在处理LeftMouseUp事件,因为Cyborgx37说。

您可以在按钮上使用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="..." />

这种方式非常简单,但这取决于您的需求。

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

答案 2 :(得分:0)

尝试使用事件PreviewMouseLeftButtonUp。