所以我在VS2010的全新WPF应用程序中删除了MainWindow.xaml上的标准WPF Calendar
控件。如果我单击日历中的某一天,然后尝试单击该应用程序的“关闭”按钮,则必须在关闭按钮上单击两次才能接受该单击。它就像Calendar
没有释放鼠标与应用程序的其余部分进行交互一样。
我已将Focusable
更改为false,但效果没有变化,我尝试覆盖PreviewOnMouseUp
并调用ReleaseMouseCapture()
无效。我对MouseLeave
和MouseLeftButtonUp
做了同样的事情,结果相同。鉴于这些东西都不起作用我怀疑我正在咆哮错误的树。虽然也许我的GoogleFu今天不能满足要求,但谷歌已经没有注意到了。
有什么想法吗?
答案 0 :(得分:29)
您可以通过使用如下处理程序订阅日历的PreviewMouseUp事件来更改此行为:
private void Calendar_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (Mouse.Captured is CalendarItem)
{
Mouse.Capture(null);
}
}
答案 1 :(得分:2)
日历控件托管在弹出窗口中,并捕获鼠标。当您第一次单击其他位置时,捕获会将单击发送到弹出窗口,这会意识到您已在自身外部单击,然后关闭。因此,点击不会转到按钮。
使用ComboBox时可以看到相同的效果。将其放下,然后单击按钮。它不会单击按钮。
不幸的是,你不可能做任何改变这种行为的事情。
编辑:更新版本的.NET可以提供解决方案。见Eren的回答。
答案 2 :(得分:1)
这是我用来解决鼠标捕获问题和子控件缺少Click事件的代码的基础。它可以进一步简化,使日历控件更容易直接访问,但我个人倾向于将它添加到UserControl中。
class FixedCalendar : UserControl
{
public FixedCalendar()
{
InitializeComponent();
}
protected override void OnPreviewMouseUp(MouseButtonEventArgs e)
{
base.OnPreviewMouseUp(e);
if (Mouse.Captured is System.Windows.Controls.Primitives.CalendarItem)
{
Mouse.Capture(null);
var element = e.OriginalSource as FrameworkElement;
if (element != null)
element.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
}
}
}
<UserControl x:Class="FixedCalendar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Calendar x:Name="Calendar" />
</UserControl>
答案 3 :(得分:1)
此代码必须提供帮助
Calendar.PreviewMouseUp += (o, e) =>
{
if (!e.OriginalSource.Equals(Calendar))
{
Mouse.Capture(null);
}
};