Laden...
Caveman
myCSharp.de - Member
49
Themen
219
Beiträge
Letzte Aktivität
vor 13 Stunden
Dabei seit
18.10.2009
Erstellt vor 11 Tagen

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.

Erstellt vor einem Monat

Hast du den Buttons auch den Style zugewiesen?

Erstellt vor einem Monat

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>
Erstellt vor einem Monat

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.

Erstellt vor einem Monat

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>
Erstellt vor einem Monat

Das Thema wurde hier https://stackoverflow.com/questions/12882423/datagrid-disabling-rows-wpf behandelt. Vielleicht hilft Dir das weiter.

Erstellt vor 2 Monaten

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.

Erstellt vor 2 Monaten

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('-'));
Erstellt vor 2 Monaten

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.

Erstellt vor 3 Monaten

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);
        }
10 von 219 Beiträgen