2

我有一个窗口,它有让用户填写值的字段,但是当我显示一个 MessageBox 告诉用户某些字段无效时,它会阻止用户从 MessageBox 更改为窗口。

我将如何创建 MessageBox 以便它允许在拥有 MessageBox 的同时访问窗口?我应该多线程吗?有没有办法让像 MessageBox 这样的对象不会锁定应用程序的其余部分?

代码:

 string unfilled = @"The following fields are mandatory and are required to continue:";
 bool invalid = false;
 foreach(Field f in _view.FormFields) {
      if(f.IsMandatory > 0 && !f.IsValid) {
           unfilled += "\n" + f.LongDisplay;
           foreach(string s in f.ErrorMessages) {
                unfilled += "\n\t" + s;
           }
           invalid = true;
      }
 }

 if(invalid) {
      MessageBox.Show(unfilled, "Invalid Submission"); <-- locks up WPF application
      return;
 }
4

3 回答 3

4

MessageBox 对于显示它的表单是模态的。

作为一种解决方法,您始终可以显示一个单独的 wpf 表单。或者,您可以在当前所在的表单上显示错误文本。

于 2012-10-18T18:24:40.343 回答
0

在这种情况下,听起来您可能会更好地在 wpf 表单上显示文本。我不确定带有浮动验证消息框的 UI 是否非常直观。

更好的是查看 wpf 开箱即用支持的验证内容,以突出显示需要输入的所需项目。

于 2012-10-18T18:34:14.817 回答
0

您可以在标记的底部定义一个单独的 Grid 并通过将可见性设置为 visible 来向您的用户显示带有消息的网格。然后捕获窗口的鼠标单击,如果显示消息的网格可见,则将可见性设置为隐藏。下面是弹出网格的示例。

<Grid x:Name="MyMessageBox" Visibility="Hidden">
        <Grid Background="Black" Opacity="0.5"/>
        <Border
        MinWidth="250"
        Background="Orange" 
        BorderBrush="Black" 
        BorderThickness="1" 
        CornerRadius="0,55,0,55" 
        HorizontalAlignment="Center" 
        VerticalAlignment="Center">
            <StackPanel>
                <TextBlock Margin="5" Text="" Name="MessageText" FontWeight="Bold" FontFamily="Cambria" />
                </StackPanel>
            </StackPanel>
        </Border>
    </Grid>
于 2012-10-18T18:37:09.980 回答