关于线程的WPF错误

本文关键字:WPF 错误 线程 于线程 | 更新日期: 2023-09-27 18:11:48

我正在尝试开始学习WPF。我添加了PresentationCore, PresentationFramework, System的引用。XAML和WindowsBase到我的类库中,并输入以下代码:

internal struct Program
{
    static void Main(string[] args)
    {
        new MainScreen().Open();
    }
}
internal struct MainScreen
{
    private Window _Window;
    private Grid _LayoutRoot;
    internal void Open()
    {
        _Window = new Window();
        _LayoutRoot = new Grid();
        _Window.Content = _LayoutRoot;
        addBackground();
        addDataGrid();
        _Window.WindowState = WindowState.Maximized;
        _Window.ShowDialog();
    }
    private void addBackground()
    {
        LinearGradientBrush bkg = new LinearGradientBrush();
        GradientStopCollection grdCol = new GradientStopCollection();
        GradientStopCollection grdStops = new GradientStopCollection();
        grdStops.Add(new GradientStop(Color.FromArgb(255, 150, 150, 150), 0));
        grdStops.Add(new GradientStop(Color.FromArgb(255, 235, 235, 235), .7));
        grdStops.Add(new GradientStop(Color.FromArgb(255, 150, 150, 150), 1));
        bkg.GradientStops = grdStops;
        _LayoutRoot.Background = bkg;
    }
    private void addDataGrid()
    {
        DataGrid dgrRecords = new DataGrid();
        dgrRecords.Margin = new Thickness(0, 70, 0, 0);
        dgrRecords.IsReadOnly = true;
        DataGridColumn colID = new DataGridTextColumn();
        DataGridHelper grdHelper = new DataGridHelper(dgrRecords, new GetSelected(processGridSelection));
        grdHelper.SetDoubleClick();
        grdHelper.AddColumn("colID", "ID", "ID");
        grdHelper.AddColumn("colLastName", "Last Name", "LastName");
        grdHelper.AddColumn("colFirstName", "First Name", "FirstName");
        List<Person> People = new List<Person>();
        People.Add(new Person(0, "FName1", "LName1"));
        People.Add(new Person(1, "FName100", "LName100"));
        dgrRecords.ItemsSource = People;
        _LayoutRoot.Children.Add(dgrRecords);
    }
    private void processGridSelection(object item)
    {
        Person person = (Person)item;
        MessageBox.Show(person.LastName);
    }
}
internal struct DataGridHelper
{
    private DataGrid _DataGrid;
    private GetSelected _GetSelected;
    internal DataGridHelper(DataGrid dgr, GetSelected getSelected)
    {
        _DataGrid = dgr;
        _GetSelected = getSelected;
        _DataGrid.AutoGenerateColumns = false;
    }
    internal void SetDoubleClick()
    {
        _DataGrid.MouseDoubleClick += new MouseButtonEventHandler(mouseDoubleClick);
    }
    internal void AddColumn(string colName, string header, string fieldBinding)
    {
        DataGridTextColumn col = new DataGridTextColumn();
        col.Binding = new Binding(fieldBinding);
        col.Header = header;
        _DataGrid.Columns.Add(col);
    }
    private void mouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (_DataGrid.SelectedIndex < 0)
            return;
        _GetSelected.Invoke(_DataGrid.SelectedItem);
    }
}
internal enum Screen
{
    Person,
    People
}
internal delegate void GetSelected(object item);
当我尝试打开应用程序时,我得到以下错误:

类型为"System"的未处理异常。InvalidOperationException'在PresentationCore.dll中发生

附加信息:调用线程必须是STA,因为许多UI组件都需要这个。

我被困在如何解决这个问题,特别是因为我不使用任何多线程。此外,我不知道这是否重要,除了似乎所有的组件,如窗口,网格,DataGrid等都是类而不是结构。我已经修改了DatagridHelper结构,以避免如果使用类就可以避免的构造错误。WPF是否偏向于面向对象编程?

关于线程的WPF错误

您必须在主方法中添加[STAThread]

[STAThread]
static void Main(string[] args)
{
    new MainScreen().Open();
}