Die Methode Refresh() wird nicht gefunden

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von jule.

    Die Methode Refresh() wird nicht gefunden

    Guten Abend,

    ich bin relativer Neuling und versuche gerade, in meiner WPF-Anwendung mein MainWindow manuell zu aktualisieren.
    Dazu habe ich von der Methode Refresh() gelesen. Nun weiß ich aber nicht, wie ich die Methode aufrufen kann.

    Wenn ich System.Windows.Forms.Refresh() versuche, erhalte ich folgende Fehlermeldung:
    Der Typ- oder Namespacename "Refresh" ist im Namespace "System.Windows.Forms" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.)

    Mit Control.Refresh() bzw. System.Windows.Forms.Control.Refresh() erhalte ich
    Für das nicht statische Feld, die Methode oder die Eigenschaft "Control.Refresh()" ist ein Objektverweis erforderlich.

    Mit Refresh() erhalte ich
    Der Name "Refresh" ist im aktuellen Kontext nicht vorhanden.

    Mit this.Refresh() erhalte ich
    "MainWindow" enthält keine Definition für "Refresh", und es wurde keine verfügbare Refresh-Erweiterungsmethode gefunden, die ein erstes Argument vom Typ "MainWindow" akzeptiert(möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis).

    Wie rufe ich die Methode auf? Welcher Assemblyverweis fehlt mir? Oder übersehe ich etwas anderes?
    Den Verweis System.Windows.Forms habe ich.

    Vielen Dank im Vorraus!

    Gruß,
    jule
    Hallo Jule und Willkommen im Forum

    jule schrieb:

    Dazu habe ich von der Methode Refresh() gelesen.

    Wo hast du das gelesen? Wäre mir nicht bekannt!

    jule schrieb:

    Wenn ich System.Windows.Forms.Refresh() versuche

    jule schrieb:

    Den Verweis System.Windows.Forms habe ich.

    Wenn du WPF Programmierst, warum dann der Verweis auf Windows.Form? Hat hier(!!) nichts verloren!

    Beschreibe mal etwas genauer was du machen willst bzw. WAS du WIE Aktualisieren möchtest.
    Ein kleiner Tipp vorweg, in der WPF wird in der Regel mit Binding gearbeitet, siehe hierfür meine Signatur, da findest du ein Tutorial - denn die WPF funktioniert anders als du im Moment glaubst (denke ich)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha,

    erstmal vielen Dank für die Antwort!

    Mein Problem ist folgendes: Ich starte in MainWindow.xaml.cs mehrere Installationsvorgänge, die einige Zeit brauchen. Damit der Nutzer weiß, dass das Programm noch lädt, möchte ich in einem Label den Hinweis geben, dass gerade installiert wird und wenn eine Installation abgeschlossen ist den Hinweis dazu. Aber der Text in dem Label erscheint erst auf der Oberfläche, wenn sämtliche Installationen abgeschlossen sind, so dass der Nutzer keinen Installationsstatus erhält. In etwa so:

    C#-Quellcode

    1. private void btnStart_Click(object sender, RoutedEventArgs e)
    2. {
    3. lbStatus.Content = "wird installiert";
    4. Thread.Sleep(5000); // stellvertretend für die Installationen
    5. lbStatus.Content = "Installation abgeschlossen";
    6. }

    Der Labeltext wird erst nach 5 Sekunden angezeigt, so dass der erste Text "verschluckt" wird.

    Refresh() habe ich in Foren gefunden, aber ich habe mir die Beiträge nach deinem Hinweis noch einmal durchgelesen. Ich habe wohl Windows Forms mit WPF gleichgesetzt X/ (wie gesagt, ich bin Neuling in Visual Studio...).

    Gibt es ähnliche Methoden für WPF-Anwendungen? Oder sonstige Tricks, um die Labels vorher zu aktualisieren?
    Oder habe ich noch etwas falsch verstanden?

    Vielen Dank!

    Grüße,
    jule
    Hallo Jule

    Du bedankst dich zwar für die Antwort, hast diese aber nicht befolgt wie es scheint.
    Du solltest du Binding verwenden, machst du nicht.

    Die UI bleibt hängen weil du die Operation im UI Thread erledigst. Was dann klar ist. Hierfür solltest du Async/Await nutzen.
    Zusammen mit Binding würde das wie folgt aussehen:

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:WpfAsync"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <Grid.RowDefinitions>
    11. <RowDefinition Height="29*"/>
    12. <RowDefinition Height="390*"/>
    13. </Grid.RowDefinitions>
    14. <Button Content="Starte Instalation" Click="Install_Click"/>
    15. <StackPanel Grid.Row="1" Margin="10">
    16. <TextBlock Text="{Binding Status}"/>
    17. <ProgressBar Minimum="0" Maximum="10" Height="20" Width="200" HorizontalAlignment="Left"
    18. Visibility="{Binding ProgressVisibility}" Value="{Binding Progress}" Margin="5"/>
    19. <TextBlock Text="{Binding CurrentItem}"/>
    20. </StackPanel>
    21. </Grid>
    22. </Window>


    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Class MainWindow
    3. Implements INotifyPropertyChanged
    4. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    5. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    6. Progress = 0
    7. ProgressVisibility = Visibility.Hidden
    8. Me.DataContext = Me
    9. End Sub
    10. Private Async Function InstallAll() As Task(Of Boolean)
    11. ProgressVisibility = Visibility.Visible
    12. Progress = 0
    13. Status = "Installation gestartet..."
    14. Await Task.Delay(1000)
    15. Status = "Installation..."
    16. For i As Integer = 0 To 10
    17. CurrentItem = $"Programm {i} wird installiert..."
    18. Progress = i
    19. Await Task.Delay(1000)
    20. Next
    21. Status = "Installation abgeschlosen"
    22. Await Task.Delay(1000)
    23. Status = ""
    24. CurrentItem = ""
    25. ProgressVisibility = Visibility.Hidden
    26. Return True
    27. End Function
    28. Private _status As String
    29. Public Property Status() As String
    30. Get
    31. Return _status
    32. End Get
    33. Set(ByVal value As String)
    34. _status = value
    35. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(Status)))
    36. End Set
    37. End Property
    38. Private _progressVisibility As Visibility
    39. Public Property ProgressVisibility() As Visibility
    40. Get
    41. Return _progressVisibility
    42. End Get
    43. Set(ByVal value As Visibility)
    44. _progressVisibility = value
    45. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(ProgressVisibility)))
    46. End Set
    47. End Property
    48. Private _progress As Integer
    49. Public Property Progress() As Integer
    50. Get
    51. Return _progress
    52. End Get
    53. Set(ByVal value As Integer)
    54. _progress = value
    55. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(Progress)))
    56. End Set
    57. End Property
    58. Private _currentItem As String
    59. Public Property CurrentItem() As String
    60. Get
    61. Return _currentItem
    62. End Get
    63. Set(ByVal value As String)
    64. _currentItem = value
    65. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(CurrentItem)))
    66. End Set
    67. End Property
    68. Private Sub Install_Click(sender As Object, e As RoutedEventArgs)
    69. Debug.WriteLine(Task.Run(Function() InstallAll()))
    70. End Sub
    71. End Class


    Wie gesagt, schau dir mein Tutorial an und gehe es durch. Einfach so mit der WPf anfangen wird nicht klappen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##