Вы делаете WPF способом WinForms.Не делай этого.Это похоже на написание VB-кода на C ++.Это может закончиться только слезами.
Чтобы сделать это способом WPF, используйте привязку данных и класс модели представления, чтобы выполнить логику «не более 3 за один раз».Затем для пользовательского интерфейса просто свяжите PointList в вашей модели представления.
Вот как должен выглядеть мой XAML.Обратите внимание, что я просто использую ItemsControl и Canvas, затем связываю ItemsSource с PointList:
<Window x:Class="WpfTester.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<ItemsControl ItemsSource="{Binding Path=PointList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Fill="Red" Width="25" Height="25" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Path=X}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</Window>
Затем нам просто нужно создать PointList.Мы будем использовать обычные средства WPF: класс модели представления для хранения списка точек:
class MainViewModel
{
public MainViewModel()
{
PointList = new ObservableCollection<Point>();
// Some example data:
AddPoint(new Point(10, 10));
AddPoint(new Point(200, 200));
AddPoint(new Point(500, 500));
}
public ObservableCollection<Point> PointList { get; private set; }
public void AddPoint(Point p)
{
// 3 at most, please!
if (PointList.Count == 3)
{
PointList.RemoveAt(0);
}
PointList.Add(p);
}
}
Кусок сыра, да?Таким образом, последняя часть просто говорит XAML загрузить вашу модель представления.Внутри кода для вашего XAML установите DataContext для вашей модели представления:
// Inside MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
// Add this line:
this.DataContext = new MainViewModel();
}
Теперь, когда у вас есть это, вы можете добавлять / удалять прямоугольники в любом месте вашего кода, просто вызываяviewModel.AddPoint или viewModel.PointList.Remove, и пользовательский интерфейс будет автоматически обновляться для отражения изменений.