Hallo,
in der Dokumentation zu einer API steht, dass kein Multithreading unterstützt wird. Ich habe jetzt eine Erweiterung programmiert, wo eine Fortschrittsanzeige implementiert ist, weil der Vorgang unter Umständen länger dauern kann. Natürlich ist die Gui eingefroren während der Aktion, so dass der Sinn der Fortschrittanzeige nicht gegeben ist.
Meine Versuche mit Threading und async/await führten allesamt dazu dass das Programm abschmiert. Welche Möglichkeiten habe ich noch, um die Gui zu entkoppeln? Ich verwende das Framework 4.8.1.
Du musst den Target type noch angeben.
<Window.Resources>
<Style TargetType="Button" x:Key="button1">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="Background" Value="LightGray"/>
</Style>
<Style TargetType="Button" x:Key="button2">
<Setter Property="Foreground" Value="Green"/>
<Setter Property="Background" Value="LightGray"/>
</Style>
</Window.Resources>
Okay, da sind mehrere Fehler enthalten. Beispielsweise Klassen in Klassen, usw.
Außerdem verwendest Du nicht das MVVM-Pattern.
Hier mal mein Ansatz:
Im ersten Schritt erstellen wir ein UserControl SpielpaarungControl.xaml, das das Aussehen einer Spielpaarung enthält
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="30" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="25" />
</Grid.ColumnDefinitions>
<Image x:Name="Team1Flagge"
Grid.Column="0"
Height="16"
Width="16"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Source="{Binding Team1.LandFlagge}"/>
<TextBlock x:Name="Team1Name"
Grid.Column="1"
HorizontalAlignment="Left"
Text="{Binding Team1.LandName}"/>
<TextBlock x:Name="MatchSeparator"
Grid.Column="2"
HorizontalAlignment="Center"
Text="vs."/>
<TextBlock x:Name="Team2Name"
Grid.Column="3"
HorizontalAlignment="Right"
Text="{Binding Team2.LandName}"/>
<Image x:Name="Team2Flagge"
Grid.Column="4"
Height="16"
Width="16"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Source="{Binding Team2.LandFlagge}"/>
</Grid>
In MainWindow.xaml wird dieses UserControl in die ListView als Vorlage definiert. Zusätzlich definieren wir den DataContext, also eine Klasse, wo MainWindow die benötigten Daten findet.
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Grid>
<StackPanel>
<TextBlock Text="Spielpaarungen"/>
<ListView x:Name="listView"
Height="auto"
Width="auto"
ItemsSource="{Binding Spielpaarungen}">
<ListView.ItemTemplate>
<DataTemplate>
<local:SpielpaarungControl />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Grid>
Es werden noch drei Klassen benötigt - jede Klasse in eine separate Datei. Das sind MainWindowViewModel.cs, Mannschaft.cs und Spielpaarung.cs.
Die Klasse Mannschaft:
public class Mannschaft
{
#region Eigenschaften
public string LandFlagge { get; set; }
public string LandName { get; set; }
#endregion
}
Die Klasse Spielpaarung:
public class Spielpaarung
{
#region Eigenschaften
public Mannschaft Team1 { get; set; }
public Mannschaft Team2 { get; set; }
#endregion
#region Konstruktoren
public Spielpaarung(Mannschaft team1, Mannschaft team2)
{
Team1 = team1;
Team2 = team2;
}
#endregion
}
Die Klasse MainWindowViewModel, das die Logik enthält:
public class MainWindowViewModel
{
#region Felder
private List<Mannschaft> teams;
#endregion
#region Eigenschaften
public List<Spielpaarung> Spielpaarungen { get; set; }
#endregion
#region Konstruktoren
public MainWindowViewModel()
{
Start();
}
#endregion
#region Methoden
private void Start()
{
teams =
[
new Mannschaft()
{
LandName = "Deutschland",
LandFlagge = "Flaggen/FlagDeutschland.png"
},
new Mannschaft()
{
LandName = "Russland",
LandFlagge = "Flaggen/FlagRussland.png"
},
new Mannschaft()
{
LandName = "Polen",
LandFlagge = "Flaggen/FlagPolen.png"
},
new Mannschaft()
{
LandName = "Portugal",
LandFlagge = "Flaggen/FlagPortugal.png"
},
];
Spielpaarungen =
[
new Spielpaarung(teams[0], teams[1]),
new Spielpaarung(teams[2], teams[3])
];
}
#endregion
}
Ergänzend sei noch angemerkt, dass keine Benachrichtigungen erfolgen, wenn sich Eigenschaften ändern. Dafür kannst Du das CommunityToolkit MVVM verwenden oder INotifyPropertyChanged, oder oder oder.
Ich denke mal, dass Du eine Klasse Spielpaarung mit zwei Eigenschaften vom Typ Mannschaft erstellen musst.
Im CellTemplate / Stackpanel dann
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Mannschaft1.LandName}"/>
<Image Source="{Binding Mannschaft1.LandFlagge}" Height="16" Width="16"/>
<TextBlock Text="{Binding Mannschaft2.LandName}"/>
<Image Source="{Binding Mannschaft2.LandFlagge}" Height="16" Width="16"/>
</StackPanel>
Das Thema wurde hier https://stackoverflow.com/questions/12882423/datagrid-disabling-rows-wpf behandelt. Vielleicht hilft Dir das weiter.
Radiobuttons kann man auch stylen. Du hast also die Möglichkeit, das Aussehen nach Deinen Wünschen anzupassen.
Du kannst auch separate Buttons benutzen und eine Logik entwerfen, jeden Button über die Eigenschaft IsEnabled zu aktivieren/deaktivieren.
Mit einer while-Schleife und ReadKey.
char key;
do
{
Console.WriteLine();
Console.Write("Bitte gib + oder - ein ");
ConsoleKeyInfo keyInfo = System.Console.ReadKey();
key = keyInfo.KeyChar;
} while (!key.Equals('+') && !key.Equals('-'));
Das Problem ist, dass der Datapoint für die X/Y-Werte nur double verarbeiten kann. Also kannst Du keine Strings als X-Werte verwenden. Das wird dann alles zu 0 konvertiert und liegt demzufolge übereinander.
Du musst die X-Werte der Eigenschaft AxisLabel eines Datapoint zuweisen und die X-Werte hochzählen.
chart1.Series["Daten"].Points.Add(new DataPoint() { AxisLabel = datumNeu[i], XValue = i, YValues = [data[i]] });
Damit sollte das gewünschte Ergebnis angezeigt werden.
Wie schon weiter oben erwähnt sollte das hier funktionieren.
private void Anzeige(int screenIdx, int xPos, int yPos, int xDim, int yDim)
{
Screen monitor = Screen.AllScreens[screenIdx];
Rectangle screenArea = monitor.WorkingArea;
f3.StartPosition = FormStartPosition.Manual;
f3.BackColor = Color.RebeccaPurple;
f3.Size = new Size(xDim, yDim);
f3.Location = new Point(screenArea.X + xPos, screenArea.Y + yPos);
}