Gå til innhold

C#: While loop & Button IsPressed C# & WPF


Anbefalte innlegg

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
Videoannonse
Annonse

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 av :Francis:
Lenke til kommentar

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

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
  • 5 måneder senere...

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...