Harlock66
27-04-2012, 21:50
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#
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
<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>
E questo e' il codebehind. Data la semplicita' non c'e' ViewModel ma e' tutto qui.
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 :)
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)
};
}
}
Per finire qui un risultato
http://img.photobucket.com/albums/v314/gugogugo/StampaRettangoli.jpg
Harlock66
01-05-2012, 21:14
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.