Implementieren eines SliderButtons
Guten Tag^^
Tut mir Leid, dass ich euch so auf Trab halte^^
Ich bin bei meinem nächsten Problem angelangt.. und zwar will ich einen Slider Coden.. also so wie beim Lockscreen von WM6.5 oder S2U2.
Ich schäze mal das geht man am besten mit einer Trackbar an oder?
Meine Idee ist es nun eine Trackbar zu gestalten die immer wieder auf 0 springt wenn der Wert nicht 10 ist...
also habe mir einen MyTrack : Control erstellt.
Wenn ich jetzt mit Void MyTrack1ValueChanged arbeite.. komme ich nicht voran...
Der Code würde dann etwa so aussehen:
Code:
void MyTrack1ValueChanged(object sender, EventArgs e)
{
if (myTrack1.Value == 10)
{
MessageBox.Show("10 erreicht");
}
else myTrack1.Value = 0;
}
Da hier jedesmal neu geschaut wird welchen Wert .value hat bleibt der Slider IMMER auf 0 und lässt sich nicht verschieben...
Also wollte ich mit void MyTrack1MouseUp(object sender, MouseEventArgs e) dahinter gehen... folgender Code:
Code:
void MyTrack1MouseUp(object sender, MouseEventArgs e)
{
if (myTrack1.Value == 10)
{
MessageBox.Show("10 erreicht");
}
else myTrack1.Value = 0;
}
Jetzt habe ich aber das Problem, dass mir beim debuggen gesagt wird, dass MouseUp für die Compact Framework Plattform nicht brauchbar ist...
Jetzt frage ich mich wie ich das sonst noch angehen kann... Die Überprüfung darf erst stattfinden, wenn ich den Slider "loslasse"
Help^^
AW: Trackbar auf 0 setzen wenn Wert kleiner als 10
Um auf MouseUp reagieren zu können, muss das wohl mit einem Button gelöst werden. Sieht dann meiner Meinung nach auch besser aus, als mit der Trackbar.
Definiere eine linke und rechte Grenze, die im MouseMove überprüft werden. Und im MouseUp wird die Position an die Grenze gesetzt, die näher ist. (hier kann man dann auch einen Timer aktivieren, der den Button um einen kleinen Betrag in Richtung der Grenze verschiebt, um eine Art Animation zu erhalten)
AW: Trackbar auf 0 setzen wenn Wert kleiner als 10
Tut mir leid für meine Frage...
Code:
private void buttonSlider1_MouseDown(object sender, MouseEventArgs e)
{
move = true;
rect.Y = e.Y;
label1.Text = "MousePosition" + rect.X;
}
private void buttonSlider1_MouseMove(object sender, MouseEventArgs e)
{
if (move)
{
buttonSlider1.Left += e.X - rect.X;
}
}
private void buttonSlider1_MouseUp(object sender, MouseEventArgs e)
{
move = false;
}
So kann ich den Button nur horizontal verschieben.. aber wie stelle ich jetzt einen Bereich ein?... die rect.X ist jetzt natürlich nur die Maus Position über dem Button...
hmmm
Edit:
Und bei meinem Code wird die Position erst bei MouseDown berechnet.. kann man das in "echtzeit" berechnen lassen?
Edit2:
Ich schätze man muss es mit einem Panel machen oder?
Code:
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
move = true;
panrect.X = e.X;
panrect.Y = e.Y;
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (move)
{
posi = e.X - panrect.Left ;
}
if (posi >= 120 && move != false)
{
MessageBox.Show("Bla");
}
label2.Text = "MousePosition" + posi;
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
move = false;
if (posi < 120)
{
posi = 0;
}
label2.Text = "MousePosition" + posi;
}
Ist das mal ein guter Ansatz?
Ich weiss nicht wie ich von Anfang - Ende definieren soll.. also habe ich einfach 120 als zu erreichende Grösse genommen da 120 so ziemlich das Ende meines Panels ist.. und somit muss man über das ganze Panel sliden.
Aber wie fügte ich jetzt den Button auf das Panel? so dass er immer mitrutscht.
AW: Trackbar auf 0 setzen wenn Wert kleiner als 10
Im Compact Framework haben Panel oder PictureBox die MouseDown/Move/Up events (Button also nicht).
Man kann direkt eine PictureBox nehmen (einfach ein Bild dem Image Parameter zuweisen) und falls man in der MainForm eine PictureBox namens picSlider hat und die MouseMove/Up events folgendermassen implementieren:
Code:
public partial class MainForm : Form
{
const int SliderMargin = 20;
int _minX;
int _maxX;
public MainForm()
{
InitializeComponent();
_minX = SliderMargin;
_maxX = ClientRectangle.Right - picSlider.Width - SliderMargin;
picSlider.Left = _minX;
}
private void picSlider_MouseMove(object sender, MouseEventArgs e)
{
int newX = picSlider.PointToScreen(new Point(e.X, e.Y)).X;
if (newX < _minX) newX = _minX;
else if (newX > _maxX) newX = _maxX;
picSlider.Left = newX;
}
private void picSlider_MouseUp(object sender, MouseEventArgs e)
{
picSlider.Left = (picSlider.Left < (_maxX + picSlider.Width - _minX) / 2) ? _minX : _maxX;
}
}
sollte das in etwa funktionieren.
Eigentlich erstellt man ein UserControl und dort kann man dann eine PictureBox (resp. ein Panel und in diesem einen Button) rein tun und hat dann die linke/rechte Grenze vom UserControl.
AW: Trackbar auf 0 setzen wenn Wert kleiner als 10
PictureBox und Panels haben die mouse events.. buttons nicht^^
und ja ich hab als button auch ein UserControl.
Edit:
Wer lesen kann ist klar im Vorteil^^ sry
Edit2:
Wieso eigentlich?^^ Ich versuche eigentlich einen möglichst professionellen Weg zu erlernen^^ und nicht den einfachst möglichen.
Ich bin einfach noch zu müde um deinen Code richtig zu analysieren^^
Kann man einstellen dass der Punkt X NICHT der linke Ecken des PicBox ist? Bzw verhindern dass er so einen Sprung macht wenn man den "Button" am rechten Rand verschiebt?
Und wenn ich die Applikation auf meinem TP2 teste dann verzieht sich die PictureBox ziemlich wenn ich sie bewege..
AW: Trackbar auf 0 setzen wenn Wert kleiner als 10
Verzieht sich?
SizeMode der PictureBox auf StretchImage geändert?
AW: Trackbar auf 0 setzen wenn Wert kleiner als 10
Hi
Ja sie verzieht sich.. aber nicht im gewollten Sinn sondern eher wie ein Lagg...
Wenn ich sie schnell bewege seht es aus als würde es dauern bis die neue Position richtig geladen ist.. und die bewegung dazwischen wird einfach so ein "schweif"^^
Ich hoff du verstehst was ich meine.
PS:
Gratulation zum 100sten Post;-)
AW: Trackbar auf 0 setzen wenn Wert kleiner als 10
Danke, unglaublich wie schnell die Zeit vergeht! :)
Nun, jetzt müssen wir das ändern! Es muss eine Art 'double buffering' her! Typischerweise zeichnet man all die Bilder in eine 'offscreen' Bitmap und dann nur diese Bitmap, um solches Flickern zu verhindern.
Vorschlag: Den Threadtitel ändern zu 'Implementieren eines SliderButtons' oder einen neuen Thread starten.
Dann können wir einen SliderButton implementieren. Sehe es im Moment so, dass dieser 'Button' eigentlich nur eine Klasse ist, die ein Bild, eine Position und eine linke und rechte Grenze hat und die events MouseDown/Move/Up der Mainform implementiert.
AW: Trackbar auf 0 setzen wenn Wert kleiner als 10
Vielen Dank für deine grosse Hilfe und Geduld^^
Mag dumm sein aber wie ändere ich den Threadnamen?^^
Edit: Habs^^
AW: Implementieren eines SliderButtons
Und nun?^^
Wie fangen wir hier an?
AW: Implementieren eines SliderButtons
Habe mal etwas rumgeschaut und folgende zwei Projekte gefunden:
iPhoneUI (Englisch)
iPhone Slider (Englisch)
Kannst diese als Basis nehmen oder gleich direkt in die Applikation einbauen.
AW: Implementieren eines SliderButtons
Sind die beiden nicht auf VB.Net basierend?
AW: Implementieren eines SliderButtons
Erstes in C#.net zweites in VB.net und freie Konvertierungstools gibt's auch.