0
ランダムに選択した長さの色付き線で塗りつぶすキャンバスが必要です。Stroke
、StrokeThickness
、Opacity
です。 MVVMの方が良いですし、親ウィンドウのWidth
とHeight
の変更に合わせて調整します。ランダムな線をキャンバスに追加するには、定期的に?
ランダムに選択した長さの色付き線で塗りつぶすキャンバスが必要です。Stroke
、StrokeThickness
、Opacity
です。 MVVMの方が良いですし、親ウィンドウのWidth
とHeight
の変更に合わせて調整します。ランダムな線をキャンバスに追加するには、定期的に?
メインウィンドウ
ViewModelLine _viewModel;
private List<Brush> _brushes;
Random _rand;
public MainWindow()
{
this.InitializeComponent();
_viewModel = new ViewModelLine();
this.DataContext = _viewModel;
_rand = new Random();
_brushes = new List<Brush>();
var props = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static);
foreach (var propInfo in props)
_brushes.Add((Brush)propInfo.GetValue(null, null));
int interval = 10;
Task.Factory.StartNew(() =>
{
while (true)
{
System.Threading.Thread.Sleep(interval);
Dispatcher.Invoke(new Action(() => AddNew()));
}
});
}
void AddNew()
{
int w = (int)ActualWidth;
int h = (int)ActualHeight;
_viewModel.Models.Add(new ModelLine() {
X1 = _rand.Next(1, w),
X2 = _rand.Next(1, w),
Y1 = _rand.Next(1, h),
Y2 = _rand.Next(1, h),
Thickness = _rand.Next(1, 4),
Opacity = _rand.NextDouble(),
Brush = _brushes[_rand.Next(_brushes.Count)]
});
}
ビュー
<Grid>
<ItemsControl DockPanel.Dock="Bottom" DataContext="{Binding}" ItemsSource="{Binding Models}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Line X1="{Binding X1}" X2="{Binding X2}" Y1="{Binding Y1}" Y2="{Binding Y2}"
Stroke="{Binding Brush}" StrokeThickness="{Binding Thickness}" Opacity="{Binding Opacity}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
のViewModel
public class ViewModelLine
{
public ViewModelLine()
{
_models = new ObservableCollection<ModelLine>();
}
ObservableCollection<ModelLine> _models;
public ObservableCollection<ModelLine> Models { get { return _models; } set { _models = value; } }
}
モデル
public class ModelLine : INotifyPropertyChanged
{
int _x1;
public int X1 { get { return _x1; } set { _x1 = value; RaisePropertyChanged("X1"); } }
int _x2;
public int X2 { get { return _x2; } set { _x2 = value; RaisePropertyChanged("X2"); } }
int _y1;
public int Y1 { get { return _y1; } set { _y1 = value; RaisePropertyChanged("Y1"); } }
int _y2;
public int Y2 { get { return _y2; } set { _y2 = value; RaisePropertyChanged("Y2"); } }
double _opacity;
public double Opacity { get { return _opacity; } set { _opacity = value; RaisePropertyChanged("Opacity"); } }
Brush _brush;
public Brush Brush { get { return _brush; } set { _brush = value; RaisePropertyChanged("Brush"); } }
double _thickness;
public double Thickness { get { return _thickness; } set { _thickness = value; RaisePropertyChanged("Thickness"); } }
public event PropertyChangedEventHandler PropertyChanged;
void RaisePropertyChanged(string propname)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propname));
}
}