【问题标题】:WPF Button not firing a single click eventWPF按钮未触发单击事件
【发布时间】:2020-01-29 14:51:56
【问题描述】:

我有一个包含日历控件和按钮的对话框。一旦用户在日历上选择了一个日期,他们点击“保存”按钮,这将执行一个操作并关闭对话框:

<Window...>
    <Grid x:Name="CalendarGrid">
        <Grid.ColumnDefinitions>...</Grid.ColumnDefinitions>
        <Grid.RowDefinitions>...</Grid.RowDefinitions>
        <StackPanel Grid.Column="0" Grid.Row="0" x:Name="StackPanel1">
            <Calendar x:Name="StartDate" HorizontalAlignment="Center" SelectedDatesChanged="StartDate_SelectedDatesChanged" />
        </StackPanel>
        <StackPanel Grid.ColumnSpan="2" Grid.Row="1">
            <Button x:Name="SaveButton" Content="Save" Click="SaveButton_Click" Width="50" IsDefault="True" ClickMode="Press" />
        </StackPanel>
    </Grid>
</Window>

我遇到的问题是,在选择日期后,按钮不响应单击事件 - 我必须双击它才能触发单击事件。我曾尝试在按钮上使用 PreviewMouseLeftButtonDown、PreviewMouseDown 和 PreviewMouseUp 事件,但它们都无法完成此操作。

我在元素上放置了一个 PreviewMouseDown 进行测试,它会在第一次单击时触发。但是,在包含按钮上放置预览事件不会响应第一次单击 - 我必须像按钮一样双击它。

我还尝试在选择日期后将焦点放在按钮上:

    private void StartDate_SelectedDatesChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        SaveButton.Focus();
    }

这也不起作用,除非我正在调试并在 StartDate_SelectedDatesChanged 事件中设置一个断点。在这种情况下,在我按 F5 继续后,按钮获得焦点并且单击工作。我什至尝试在 StartDate_SelectedDatesChanged 事件中添加 Thread.Sleep() 语句,但这也不起作用。

如果这有帮助,这就是我从主屏幕打开窗口的方式。一、打开窗口的方法:

public static void SetWindowPosition(Window dialog)
{
    Window mainWindow = Application.Current.MainWindow;

    dialog.Owner = mainWindow;
    dialog.Left = mainWindow.Left + (mainWindow.ActualWidth - dialog.ActualWidth) / 2;
    dialog.Top = mainWindow.Top + (mainWindow.ActualHeight - dialog.ActualHeight) / 2.5;
}

这是调用 SetWindowPosition() 来打开对话框的代码:

 var dialog = new CalendarDialog();
 dialog.SetValues(Phrases.SelectDateRange, Phrases.StartingDate, Phrases.EndingDate, null, null);
 SetWindowPosition(dialog);

关于如何让它工作的任何建议?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    尝试在您的StartDate_SelectedDatesChanged 事件处理程序中调用Mouse.Capture(null)

    【讨论】: