soccet Skrevet 25. november 2012 Del Skrevet 25. november 2012 Hei Hvordan kan jeg kjøre While Loop mens Button Ispressed? Her vil jeg sette en bit når knapp er trykket og så skrive 0 når knapp blir sluppet. Men (IsPressed) ser ikke ut til å funke. private void Command_Drain01(object sender, RoutedEventArgs e) { if (1 == initSuccess) { while (Drain01.IsPressed) { dc.writeBits(libnodave.daveDB, 60, 2356, 1, (BitConverter.GetBytes(1))); } } { Drain01.Background = Brushes.Green; dc.writeBits(libnodave.daveDB, 60, 2356, 1, (BitConverter.GetBytes(0))); } } Noen tips? Lenke til kommentar
:Francis: Skrevet 25. november 2012 Del Skrevet 25. november 2012 (endret) Hei, Jeg har ikke noe erfaring med WPF fra tidligere av, men googlet meg frem til at man kan bruke MouseLeftButtonUp og MouseLeftButtonDown eventene hvis man setter ClickMode til Hover. using System; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace WpfApplication1 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { private bool _buttonPressed; public MainWindow() { InitializeComponent(); Button1.ClickMode = ClickMode.Hover; Button1.MouseLeftButtonUp += Button1OnMouseLeftButtonUp; Button1.MouseLeftButtonDown += Button1OnMouseLeftButtonDown; } private async void Button1OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Tbox.Text += string.Format("{0}{1}{2}", "Clicked at: ", DateTime.UtcNow, Environment.NewLine); _buttonPressed = true; var asyncRes = await DoWorkAsync(); Tbox.Text += asyncRes; } private void Button1OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { _buttonPressed = false; } private async Task<string> DoWorkAsync() { var slowTask = Task.Factory.StartNew( () => { var s = string.Empty; while (_buttonPressed) { s += string.Format("{0}{1}{2}", "Doing work: ", DateTime.UtcNow, Environment.NewLine); Thread.Sleep(1000); //To prevent too many rows during testing } s += string.Format("{0}{1}{2}", "Finished doing work at: ", DateTime.UtcNow, Environment.NewLine); return s; } ); return await slowTask; } } } Clicked at: 25.11.2012 11:29:44 Doing work: 25.11.2012 11:29:44 Doing work: 25.11.2012 11:29:45 Doing work: 25.11.2012 11:29:46 Doing work: 25.11.2012 11:29:47 Finished doing work at: 25.11.2012 11:29:48 Håper du kan få noe nyttig ut av dette . Mvh Francis EDIT: Jeg leste ikke tittelen godt nok når jeg svarte første gang, og trodde det dreide seg om SilverLight (som jeg heller aldri har brukt før), men det samme fungerer i WPF. Endret 25. november 2012 av :Francis: Lenke til kommentar
GeirGrusom Skrevet 25. november 2012 Del Skrevet 25. november 2012 Hei Hvordan kan jeg kjøre While Loop mens Button Ispressed? Her vil jeg sette en bit når knapp er trykket og så skrive 0 når knapp blir sluppet. Men (IsPressed) ser ikke ut til å funke. private void Command_Drain01(object sender, RoutedEventArgs e) { if (1 == initSuccess) { while (Drain01.IsPressed) { dc.writeBits(libnodave.daveDB, 60, 2356, 1, (BitConverter.GetBytes(1))); } } { Drain01.Background = Brushes.Green; dc.writeBits(libnodave.daveDB, 60, 2356, 1, (BitConverter.GetBytes(0))); } } Noen tips? Du må aldri ha en loop i en eventhandler. Dette vil føre til at programmet ditt slutter å svare, da programmet ikke får tid til å behandle hendelser fordi programmet ditt bruker den tråden til å ikke gjøre noe som helst.. Lenke til kommentar
soccet Skrevet 26. november 2012 Forfatter Del Skrevet 26. november 2012 Hei Tusen takk. Regner med jeg kan bruke AsyncCallback til dette. Soccet Lenke til kommentar
soccet Skrevet 26. november 2012 Forfatter Del Skrevet 26. november 2012 Hei Det funker bra og bruke PreviewMouseButtonUp private void MouseDrainDown01(object sender, RoutedEventArgs e) { if (1 == initSuccess) { { dc.writeBits(libnodave.daveDB, 60, 2356, 1, (BitConverter.GetBytes(1))); } } } private void MouseDrainUp01(object sender, RoutedEventArgs e) { if (1 == initSuccess) { //Drain01.Background = Brushes.Green; dc.writeBits(libnodave.daveDB, 60, 2356, 1, (BitConverter.GetBytes(0))); } } Er det noe i veien for å bruke dette oppsettet? Lenke til kommentar
Hayer Skrevet 29. april 2013 Del Skrevet 29. april 2013 Du må aldri ha en loop i en eventhandler. Dette vil føre til at programmet ditt slutter å svare, da programmet ikke får tid til å behandle hendelser fordi programmet ditt bruker den tråden til å ikke gjøre noe som helst.. Bare et sidespørsmål; Hva om eventhandler kjører i en annen tråd? Da vil det jo selvsagt ikke henge, men man vil få cross-thread operations som må behandles med omhu når man setter verdier på formen igjen. Så dette gjort på en applikasjon, klarer ikke helt skjønne hvorfor. Noen spesielle scenarioer dette er ønskelig/en god løsning? Lenke til kommentar
GeirGrusom Skrevet 29. april 2013 Del Skrevet 29. april 2013 Bare et sidespørsmål; Hva om eventhandler kjører i en annen tråd? Da vil det jo selvsagt ikke henge, men man vil få cross-thread operations som må behandles med omhu når man setter verdier på formen igjen. Så dette gjort på en applikasjon, klarer ikke helt skjønne hvorfor. Noen spesielle scenarioer dette er ønskelig/en god løsning? Det er selvsagt mulig å starte en ny tråd i en eventhandler for å sikre at det ikke blir noe heng, men det er generelt brudd på adskillelse av logikk og presentasjon å gjøre noe slikt i en eventhandler. En eventhandler må oppdatere state i et annet objekt. Dersom denne kosen skal skje asynkront så må objektet som skal oppdateres sørge for at dette blir gjort korrekt. En eventhandler bør sørge kun for at nødvendig data blir flyttet fra presentasjon til logikk og stoppe der, så skal logikken sørge for å oppdatere presentasjonen når operasjonen er ferdig, eller et eller annet kriterie sier at det er greit. Kikk forøvrig på Reactive Extensions også. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå