2014-07-08 5 views
0

J'essaie de commencer à apprendre WPF. J'ai ajouté une référence de PresentationCore, PresentationFramework, System.Xaml et WindowsBase à ma bibliothèque de classe et entré le code suivant:Erreur WPF concernant le filetage

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); 

Je reçois l'erreur suivante lorsque je tente d'ouvrir l'application:

Une Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans PresentationCore.dll

Informations complémentaires: Le thread appelant doit être STA, car de nombreux composants UI l'exigent.

Je suis bloqué sur la façon de résoudre ce problème, d'autant plus que je n'utilise pas de multi-threading. En outre, je ne sais pas si cela compte, sauf qu'il semble que tous les composants, tels que Window, Grid, DataGrid, etc sont toutes les classes au lieu de structures. J'ai déjà dû modifier ma structure DatagridHelper pour éviter une erreur de construction que j'aurais pu éviter si j'avais utilisé une classe. Est-ce que WPF est biaisé vers la programmation orientée objet?

+0

En aparté, pourquoi tous vos struct de type? C'est * très * rarement une bonne idée de créer vos propres structures ... et certainement pas pour des choses comme les écrans d'interface utilisateur. –

+1

votre méthode principale doit être [STAThread] static void Main (string [] args) –

+0

J'ai surtout travaillé avec des structures parce que le livre que j'ai appris ne les utilise que. Cependant, je pourrais utiliser des classes et les traiter comme des structures. Cela pourrait rendre les choses plus fluides. – user3814870

Répondre

2

Vous devez ajouter au [STAThread] principale méthode comme

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