我正在创建一个WPF,我有2个线程。一个是主要的,另一个(称为PillTimeOutChecker)检查主窗体中的一些要求。如果要求符合要求,PilleCheckerThread的新表单将显示在新的主题中。问题是我收到此错误:'System.Windows.Controls.Button'的初始化在新表单的初始化中引发了异常。
这是主线程中调用PillCheckerThread:
的方法private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread PillChecker = new Thread(new ThreadStart(PillCheckerThread));
PillChecker.SetApartmentState(ApartmentState.STA);
PillChecker.IsBackground = true;
PillChecker.Name = "PillTimeOutChecker";
PillChecker.Start();
}
这是PillCheckerThread方法的内容:
private void PillCheckerThread()
{
foreach (DataGridObject item in PillList.Items)
{
if(item.DoIt)
{
//Show PillWarning window
Thread PillWarningWindow = new Thread(new ThreadStart(() =>
{
PillWarningWindow pl = new PillWarningWindow(item.PillName, item.AlertTime);
pl.Show();
System.Windows.Threading.Dispatcher.Run();
}));
PillWarningWindow.SetApartmentState(ApartmentState.STA);
PillWarningWindow.IsBackground = true;
PillWarningWindow.Start();
}
}
}
这是PillWarningWindow的内容:
public partial class PillWarningWindow : Window
{
public PillWarningWindow(string PillName, string CurrentTime)
{
InitializeComponent();
PillNameLbl.Content = PillName;
TimeLbl.Content = CurrentTime;
}
private void CloseBtn_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
这是PillWarningWindow的xaml:
<Window x:Class="MedicalReminder.PillWarningWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MedicalReminder"
mc:Ignorable="d" Height="300" Width="713.414" ShowInTaskbar="False" Topmost="True" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" WindowStyle="None" Background="Transparent" AllowsTransparency="True">
<Border BorderBrush="Black" CornerRadius="20" Background="DarkCyan">
<Grid>
<Button x:Name="CloseBtn" Content="OK" HorizontalAlignment="Left" Margin="262,239,0,0" VerticalAlignment="Top" Width="179" Click="CloseBtn_Click"/>
<Label x:Name="label" Content="Psssttt !! It's time to take your pill: " HorizontalAlignment="Left" Margin="89,93,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="18"/>
<Label x:Name="PillNameLbl" Content="PillName" HorizontalAlignment="Left" Margin="395,93,0,0" VerticalAlignment="Top" FontSize="18" FontWeight="Bold"/>
<Label x:Name="label2" Content="It's exactly " HorizontalAlignment="Left" Margin="89,132,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="18"/>
<Label x:Name="TimeLbl" Content="12:00" HorizontalAlignment="Left" Margin="195,133,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="17" Width="56"/>
<Label x:Name="label3" Content="you forgot it ??" HorizontalAlignment="Left" Margin="256,132,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="18"/>
</Grid>
</Border>
在PillWarningWindow的构造函数中有一个断点,我发现错误从InitializeComponent方法开始。任何帮助表示赞赏。感谢。
答案 0 :(得分:0)
如果您想访问windows propety,您应该使用Dispatchers。
由于另一个线程无法直接访问窗口。如果要运行将在UI线程上执行的操作,可以使用Dispatcher。Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() => PillNameLbl.Content = PillName;
TimeLbl.Content = CurrentTime));
答案 1 :(得分:0)
如果调试器在InitializeComponent方法停止,我会说你的XAML代码可能有问题(尽管有不好的做法,但似乎不正确)。您确定您的控件没有在任何其他位置定义样式资源吗?之前我遇到过同样的错误,这是因错误的顺序定义样式造成的。
尝试直接在应用程序启动时启动窗口,而不是从另一个线程启动它,只是为了测试它是否正常。如果它有效,则问题在于线程管理。