gpt4 book ai didi

.net - WPF:MessageBox 是否会破坏 PreviewMouseDown?

转载 作者:行者123 更新时间:2023-12-02 06:09:13 27 4
gpt4 key购买 nike

我一直在尝试让我的 WPF 应用程序在使用 TreeView 导航时提示用户放弃未保存的更改或取消。

我想我发现了一个错误。 MessageBox 与 PreviewMouseDown 配合不佳。如果显示了 MessageBox,则无论其 e.Handled 如何设置,它似乎都会“处理”点击。

对于这个 XAML...

<TreeView Name="TreeViewThings"
...
PreviewMouseDown="TreeViewThings_PreviewMouseDown"
TreeViewItem.Expanded="TreeViewThings_Expanded"
TreeViewItem.Selected="TreeViewThings_Selected" >

...比较这些替代方法...

Sub TreeViewNodes_PreviewMouseDown(...)    e.Handled = FalseEnd SubSub TreeViewNodes_PreviewMouseDown(...)    MessageBox.Show("Test", "Test", MessageBoxButton.OK)    e.Handled = FalseEnd Sub

这两种方法的行为不同。如果没有 MessageBox,TreeViewNodes_Selected()TreeViewThings_Expanded() 将执行。有了 MessageBox,他们就不会了。

这是一个错误还是这里发生了一些我应该理解的事情?

最佳答案

我遇到了完全相同的问题,你认为 MessageBox 把事情搞砸了,这是正确的。老实说,在切换到 WPF 之前,我在使用 Windows 窗体时还遇到了 MessageBox 的其他问题。也许这只是一些百年历史的错误变成了一项功能(就像微软经常发生的那样)?

无论如何,我能为您提供的唯一解决方案就是对我有效的解决方案。我在使用列表框时遇到类似的情况 - 如果表单中的数据发生更改,当列表框的选择发生变化时(通过单击新项目或使用“向上”或“向下”键),我在 MessageBox 中为用户提供了是否保存、放弃或取消的选择。

自然地,使用处理 ListBox 的 MouseDown 或 PreviewMouseDown 事件的直接方法对于 MessageBox 来说效果不佳。这是有效的。

我有一个数据模板来显示列表框中的项目(我几乎希望您也有相同的):

<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();
}

作为旁注,当 ListBox 中的选定项(其 ItemsSource 绑定(bind)到 DataTable)发生更改时,Binding 总是将我的 DataRows 标记为已修改,这很奇怪(我不知道您是否使用 DataTables/Sets) 。为了解决这个问题,一旦选择已经更改,我就会丢弃所有未处理的更改(因为我会处理在此之前发生的 MouseDown 事件中所需的任何内容):

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

以及处理程序的隐藏代码:

private void clearChanges(object sender, SelectionChangedEventArgs e) {
Data.cancelChanges();
}

关于.net - WPF:MessageBox 是否会破坏 PreviewMouseDown?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/546388/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com