'System.Windows.Controls.Button'的初始化引发了一个异常

时间:2017-03-27 11:12:20

标签: c# wpf multithreading

我正在创建一个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方法开始。任何帮助表示赞赏。感谢。

2 个答案:

答案 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代码可能有问题(尽管有不好的做法,但似乎不正确)。您确定您的控件没有在任何其他位置定义样式资源吗?之前我遇到过同样的错误,这是因错误的顺序定义样式造成的。

尝试直接在应用程序启动时启动窗口,而不是从另一个线程启动它,只是为了测试它是否正常。如果它有效,则问题在于线程管理。