WPF: MessageBox повреждает PreviewMouseDown?

У меня точно такая же проблема. ngStyle заменяет это: { 'grid-column': (width > 1 ? column + ' / ' + (column + width) : column + ''), 'grid-row': '' + row }
на это: style="grid-area: 1 / unsafe / auto / unsafe при ширине> 1

8
задан Community 23 May 2017 в 11:46
поделиться

2 ответа

Это - то, что я имею. Это работает, но менее - желательный...

Sub TreeViewNodes_PreviewMouseDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
    If UnsavedChangesExist() Then
        MessageBox.Show("You have unsaved changes.", "Unsaved Changes", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK)
        e.Handled = True
    End If
End Sub

Это требует, чтобы пользователь нажал "OK", вручную нажал кнопку "Discard Changes" (около кнопки "Save"), нажал через другого, "Вы уверены?" окно сообщения, и только затем перешло с деревом снова.

0
ответ дан 6 December 2019 в 01:41
поделиться

У меня есть точно та же проблема, и Вы правы в размышлении, что MessageBox завинчивает вещи. Честно говоря, у меня были другие проблемы с MessageBox при работе с Windows Forms прежде, чем переключиться на WPF. Возможно, это - просто некоторая столетняя ошибка, которая стала функцией (как часто, это с Microsoft)?

В любом случае единственным решением, которое я могу предложить Вам, является то, которое работало на меня. У меня были проблемы с тем, чтобы заставлять аналогичную ситуацию работать с ListBox - если были изменения в данных в форме, когда выбор ListBox изменился (или путем нажатия на новый объект или израсходования ключей или "Вниз"), я предложил пользователю выбор в MessageBox, сохранить ли, отбросить или отменить.

Естественно использование прямого подхода обработки событий MouseDown или PreviewMouseDown ListBox не работало хорошо с MessageBox. Вот то, что работало.

У меня есть шаблон данных к экспонатам в моем ListBox (я почти ожидаю, что у Вас будет то же):

<ListBox.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Path=NAME}" KeyDown="checkForChanges" MouseDown="checkForChanges"/>
    </DataTemplate>
</ListBox.ItemTemplate>

Отметьте, как я переместил KeyDown и Обработчиков события mouseDown к управлению TextBlock вместо этого. Я сохранил тот же код - позади:

// The KeyDown handler
private void checkForChanges(object sender, KeyEventArgs e) {
    e.Handled = checkForChanges();
}

// Method that checks if there are changes to be saved or discard or cancel
private bool checkForChanges() {
    if (Data.HasChanges()) {
        MessageBoxResult answer = MessageBox.Show("There are unsaved changes. Would you like to save changes now?", "WARNING", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
        if (answer == MessageBoxResult.Yes) {
            Data.AcceptDataChanges();
        } else if (answer == MessageBoxResult.Cancel) {
            return true;
        }
        return false;
    }
    return false;
}

// The MouseDown handler
private void checkForChanges(object sender, MouseButtonEventArgs e) {
    e.Handled = checkForChanges();
}

Как примечание стороны, это нечетно, как Привязка всегда отмечает мой DataRows как Измененный, когда выбранный пункт в ListBox, которому связали ItemsSource с DataTable, изменения (я не знаю, используете ли Вы Таблицы данных/Наборы). Для борьбы с этим я отменяю любые необработанные изменения, после того как выбор был уже изменен (потому что я обрабатываю что-либо, что это необходимо в конечном счете MouseDown, который происходит до того):

<ListBox IsSynchronizedWithCurrentItem="True" [...] SelectionChanged="clearChanges"> ... </ListBox>

И код - позади для обработчика:

private void clearChanges(object sender, SelectionChangedEventArgs e) {
    Data.cancelChanges();
}
2
ответ дан 6 December 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: