|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 2
|
rettangolo che cambia forma con timer
Ciao a tutti sono nuovo qua quindi ringrazio anticipatamente chi mi aiutera...vengo al sodo
Ho la necessita che nello stesso rettangolo compaiano altri rettangoli piu piccoli diciamo ogni 5 secondi...il linguaggio e' c# |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Eccomi.
La soluzione, come richiesto, e' dotata di un rettangolo. Non appena si clicca sul pulsante, allora "nello stesso rettangolo compaiano altri rettangoli piu piccoli diciamo ogni 5 secondi" Ogni 5 secondi stampo circa 2 rettangoli, di coordinate e colore casuale, e termino dopo 50 secondi, ovvero circa 20 rettangoli. Questo il codice XAML di descrizione della finestra Codice:
<Window x:Class="Rectangol.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Stampa Rettangoli" Height="350" Width="525">
<DockPanel LastChildFill="True">
<Button x:Name="btn" Content="Start" Width="100" DockPanel.Dock="Top" HorizontalAlignment="Left" Click="Button_Click" />
<Border BorderThickness="2" BorderBrush="Black" Margin="5">
<Canvas x:Name="canv" />
</Border>
</DockPanel>
</Window>
Ah, e' C# 5.0, spero che vada bene. La parte principale e' il nuovo async-await pattern per le comunicazioni asincrone. Qui non si comunica e invece si aspetta 5 secondi, ma il concetto e' simile. Ovvero scrivere tutto in modo leggibile sincrono, ma inserire cicli di richieste al server in modo asincrono, migliorando decisamente la leggibilita' rispetto ai pattern precedenti. In pratica si scrive codice molto simile a quello che "Blocca la finestra", ma che qui realta' non la blocca Codice:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
try
{
btn.IsEnabled = false;
int rep = 0;
do
{
await Task.Factory.StartNew(() => Thread.Sleep(5000));
StampaRects();
rep++;
} while (rep < 10);
}
finally
{
btn.IsEnabled = true;
}
}
private static Random rnd = new Random();
private void StampaRects()
{
int num = rnd.Next(3)+1;
for(int rn=0;rn<num;rn++)
{
var ran = GetRandomRect(0,0,canv.ActualWidth, canv.ActualHeight);
Rectangle r = new Rectangle();
r.Fill = new SolidColorBrush(GetRandomColor());
r.SetValue(Canvas.LeftProperty, ran.X);
r.SetValue(Canvas.TopProperty, ran.Y);
r.SetValue(Canvas.WidthProperty, ran.Width);
r.SetValue(Canvas.HeightProperty, ran.Height);
canv.Children.Add(r);
}
}
private Rect GetRandomRect(double x0, double y0, double x1, double y1)
{
var rx0 = rnd.Next((int)(x1 - x0));
var ry0 = rnd.Next((int)(y1 - y0));
var width = rnd.Next((int)(x1 - rx0));
var height = rnd.Next((int)(y1 - ry0));
return new Rect()
{
X = rx0,
Y = ry0,
Width = width,
Height = height
};
}
private Color GetRandomColor()
{
return new Color()
{
A = (byte)(128),
R = (byte)rnd.Next(256),
G = (byte)rnd.Next(256),
B = (byte)rnd.Next(256)
};
}
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 28-04-2012 alle 16:51. |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 2
|
grazie gugoxx
Grazie gugo per il tuo interessamento...mi sono spiegato male pero nel senso che quello che vorrei ottenere e' che al verificarsi di un evento...per esempio un click in un rettangolo che ho gia nel form compaiano al suo interno altri rettangoli di larghezza uguale ma di minor lunghezza...mi sto cimentando con un applicazione domotica per cui mi serve un effetto tipo tapparella che scende...grazie
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:32.



















