WPF Calendar Control, удерживающий мышь - PullRequest
10 голосов
/ 17 мая 2011

Итак, я сбросил стандартный WPF Calendar элемент управления на MainWindow.xaml в совершенно новом приложении WPF в VS2010. Если я нажимаю на день в календаре и затем пытаюсь нажать кнопку «Закрыть» для приложения, мне нужно дважды щелкнуть кнопку «Закрыть», прежде чем она примет щелчок. Он действует так, как будто Calendar не выпустил мышь для взаимодействия с остальной частью приложения.

Я изменил Focusable на false, без изменений в силе, и я попытался переопределить PreviewOnMouseUp и вызвать ReleaseMouseCapture() безрезультатно. Я сделал то же самое с MouseLeave и MouseLeftButtonUp с тем же результатом. Учитывая, что ничего из этого не работает, я подозреваю, что я лаю не на том дереве. Google не обнаружил ничего примечательного, хотя, возможно, мой GoogleFu не работает сегодня.

Есть идеи?

Ответы [ 4 ]

29 голосов
/ 21 декабря 2011

Вы можете изменить это поведение, подписавшись на событие календаря PreviewMouseUp с помощью обработчика, подобного этому:

private void Calendar_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    if (Mouse.Captured is CalendarItem)
    {
        Mouse.Capture(null);
    }
}
2 голосов
/ 17 мая 2011

Элемент управления календаря размещается во всплывающем окне и захватывает мышь. Когда вы щелкаете где-то еще в первый раз, захват отправляет щелчок во всплывающее окно, которое, понимая, что вы нажали вне себя, закрывается. Поэтому щелчок не переходит к кнопке.

Вы можете увидеть тот же эффект при использовании ComboBox. Оставьте его, затем нажмите на кнопку. Не нажмет кнопку.

К сожалению, вряд ли вы сможете сделать что-либо, чтобы изменить это поведение.

Редактировать : Более поздние версии .NET делают возможным решение. Смотри ответ Эрен.

1 голос
/ 18 августа 2013

Этот код должен помочь

Calendar.PreviewMouseUp += (o, e) =>
{
    if (!e.OriginalSource.Equals(Calendar))
    {
        Mouse.Capture(null);
    }
};
1 голос
/ 24 октября 2011

Это основа кода, который я использую для решения проблемы захвата мыши и отсутствия событий 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...