WPF TextBlock frissítési probléma

WPF TextBlock frissítési probléma
2015-05-04T19:30:48+02:00
2015-05-05T21:44:02+02:00
2022-12-02T11:45:40+01:00
Bencsik Norbert
Sziasztok!
Problémába ütköztem a programom írása közben.
A program fő képernyőjének betöltődése után automatikusan meghívódik egy függvény, melynek feladata, hogy betöltse az adatbázisból a különböző táblák adatait. A betöltés gond nélkül megtörténik, minden tábla betöltése után a képernyő StatusBar-jában elhelyezett Textblock-ban kiíratom az éppen betöltött táblához tartozó tájékoztató szöveget. Valami miatt csak a legutoljára lefutott változás szövege jelenik meg, a többi nem.

Main.AnyagokLekerdez(); Main.KategoriakLekerdez(); Main.DbUzenet = "Kategóriák Betöltve"; Main.MertEgysLekerdezes(); Main.DbUzenet = "Mértékegységek Betöltve"; Main.RaktarListaLekerdez(); Main.DbUzenet = "Raktárak Betöltve";
A Main osztályban tárolom a program futásához szükséges adatokat.

Nem tudok rájönni hogy hol lehet a probléma, ha valakinek van ötlete kérem segítsen.
Mutasd a teljes hozzászólást!
Csúnya, de
new Thread(delegate () { Main.AnyagokLekerdez(); Main.KategoriakLekerdez(); Dispatcher.Invoke(delegate(){Main.DbUzenet = "Kategóriák Betöltve";}); Main.MertEgysLekerdezes(); Dispatcher.Invoke(delegate(){ Main.DbUzenet += "Mértékegységek Betöltve";}); Main.RaktarListaLekerdez(); Dispatcher.Invoke(delegate(){ Main.DbUzenet += "Raktárak Betöltve";}); }).Start();
persze azt nem tudjuk, hogy a lekérdező függvények thread-safek-e.
Mutasd a teljes hozzászólást!

  • Ok, azt értem mit szeretnél de a kódban azt hiszem látom a hibát.

    Main.DbUzenet = "Mértékegységek Betöltve";
    Ok, de a DbUzenet melyik részét akarod módosítani? Szélességét? Magasságát? Ami neked kell az a tartalom, ami a „Text”. Azaz

    Main.DbUzenet.Text = "Mértékegységek Betöltve";
    Mutasd a teljes hozzászólást!
  • A Main.DbUzenet az egy Text típusú változó, mely így van deklarálva:

    public string DbUzenet { get { return dbUzenet; } set { dbUzenet = value; RaisePropertyChanged("DbUzenet"); } }
    És mint írtam a mező frissítése megtörténik, csak azt nem értem, hogy miért csak az utolsó Main.DbUzenet megadása után.
    Mutasd a teljes hozzászólást!
  • Így mit látsz?

    Main.AnyagokLekerdez(); Main.KategoriakLekerdez(); Main.DbUzenet = "Kategóriák Betöltve"; Main.MertEgysLekerdezes(); Main.DbUzenet += "Mértékegységek Betöltve"; Main.RaktarListaLekerdez(); Main.DbUzenet += "Raktárak Betöltve";
    Mutasd a teljes hozzászólást!
  • Hello,
    szerintem azért, mert a lekérdezések megfogják a júzer interfész thread-jét, és nem éri utol magát.
    Google

    Google
    B
    Mutasd a teljes hozzászólást!
  • Szia,
    lehet hogy jól működik, csak nem látod.

    private void Main_Loaded(object sender, RoutedEventArgs e) { Title = "A"; System.Diagnostics.Debug.WriteLine("A"); //Thread.Sleep(1000); Title = "B"; System.Diagnostics.Debug.WriteLine("B"); //Thread.Sleep(1000); Title = "C"; System.Diagnostics.Debug.WriteLine("C"); }
    Mutasd a teljes hozzászólást!
  • Egy UpdateLayout metódus hívás segíthetne , hogy látsszon a szöveg változása.
    Mutasd a teljes hozzászólást!
  • Csúnya, de
    new Thread(delegate () { Main.AnyagokLekerdez(); Main.KategoriakLekerdez(); Dispatcher.Invoke(delegate(){Main.DbUzenet = "Kategóriák Betöltve";}); Main.MertEgysLekerdezes(); Dispatcher.Invoke(delegate(){ Main.DbUzenet += "Mértékegységek Betöltve";}); Main.RaktarListaLekerdez(); Dispatcher.Invoke(delegate(){ Main.DbUzenet += "Raktárak Betöltve";}); }).Start();
    persze azt nem tudjuk, hogy a lekérdező függvények thread-safek-e.
    Mutasd a teljes hozzászólást!
  • A megoldásodat már próbáltam korábban és így ezzel a megoldással egybe egyszerre írja ki a 3 üzenetet.
    Mutasd a teljes hozzászólást!
  • ezzel a megoldással egybe egyszerre írja ki a 3 üzenetet.

    Vagyis működik, csak gyorsan futnak le az események, s ezért csak az utolsó kiírást látod.
    Tedd külön textblock-okba a kiírandókat s mind megjelenik a maga helyén.

    Persze, ha van értelme egyáltalán..
    Mutasd a teljes hozzászólást!
  • <Window x:Class="WpfApplication4.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <TextBlock Text="{Binding MyProperty}" VerticalAlignment="Top"/> <Button VerticalAlignment="Center" Click="TaskButton_Click" Content="Task"/> <Button VerticalAlignment="Bottom" Click="UIButton_Click" Content="UI Thread"/> </Grid> </Window> using System.ComponentModel; using System.Threading; using System.Threading.Tasks; namespace WpfApplication4 { public partial class MainWindow : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propName)); } string _myProperty; public string MyProperty { get { return _myProperty; } set { _myProperty = value; OnPropertyChanged("MyProperty"); } } public MainWindow() { InitializeComponent(); DataContext = this; } private void UIButton_Click(object sender, System.Windows.RoutedEventArgs e) { MyProperty = "First"; Thread.Sleep(500); MyProperty = "Second"; Thread.Sleep(500); MyProperty = "Third"; } private void TaskButton_Click(object sender, System.Windows.RoutedEventArgs e) { Task.Factory.StartNew(() => { MyProperty = "First"; Thread.Sleep(500); MyProperty = "Second"; Thread.Sleep(500); MyProperty = "Third"; }); } }

    }
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen a segítséget, a 

    Dispatcher.Invoke(delegate()...

    elhagyása után kis késleltetéssel tökéletesen működik az elképzelésem.

    Üdv. Norbi
    Mutasd a teljes hozzászólást!
  • Kedves "dante"

    Az általad írt megoldást alkalmazom a programban, csak WPF MVVM megközelítéssel.

    Egyébként a szálkezelés megoldotta minden eddigi problémám, gyorsabb is lett tőle a programom.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd