我想显示窗口,但是我收到错误“调用线程必须是STA,因为许多UI组件需要这个”。我找到了溶剂,但每次写这个都很难。
Application.Current.Dispatcher.Invoke((Action) delegate
{
msgBox =
new CustomMessageBox(
"Файл добавлен в базу, строки " + errors +
" не были добавлены по причине неверных входных данных",
"Уведомление");
msgBox.Show();
});
还有其他的解决方案吗?我把CustomMessageBoxBelow的代码
public partial class CustomMessageBox : Window
{
public CustomMessageBox()
{
InitializeComponent();
}
public CustomMessageBox(string text, string title)
{
InitializeComponent();
Title = title;
TextBlock.Text = text;
}
private void OkBtn_OnClick(object sender, RoutedEventArgs e)
{
this.Close();
}
}
答案 0 :(得分:1)
由于WPF应用程序是 anyViewInTheLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
应用程序,因此处理UI控件的所有逻辑必须在UI线程的上下文中运行。这正是STA
用于 - 将方法调用到UI同步上下文中。
我同意你提供的代码并不好,所以你必须重构它。我建议你创建一个在后台运行的方法,返回操作的状态,包括错误代码和警告。
代码可能是这样的:
Dispatcher
我想说的其他事情是你可能应该检查用户输入 之前将其保存到数据库中,这样可以节省时间。
答案 1 :(得分:0)
创建辅助函数并在UI线程上异步调用消息框:
static void ThreadSafeMessageBox(String text)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(text)));
}
void Test()
{
Task.Run(() => { ThreadSafeMessageBox("Hi!");});
}