У меня точно такая же проблема. ngStyle заменяет это: {
'grid-column': (width > 1 ? column + ' / ' + (column + width) : column + ''),
'grid-row': '' + row
}
на это: style="grid-area: 1 / unsafe / auto / unsafe
при ширине> 1
Это - то, что я имею. Это работает, но менее - желательный...
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"), нажал через другого, "Вы уверены?" окно сообщения, и только затем перешло с деревом снова.
У меня есть точно та же проблема, и Вы правы в размышлении, что 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();
}