Рисование и удаление фигур в WPF - PullRequest
2 голосов
/ 24 августа 2010

В GDI + / WinForms я мог бы сделать это в событии Click () и использовать графический объект:

AddPoint(p); //Add Point contains some code to make sure there is only 3 dots
foreach (Point p in PointList) {
    DrawRectangle(p);
}
Invalidate();

Если я попробую что-то подобное в WPF, это не очистит созданные мной точки(Я думаю, из-за того, как работает WPF).Это означает, что если я проверю, чтобы убедиться, что есть только три точки одновременно, и выскакиваю из самой старой точки, чтобы освободить место для новой, нарисованный прямоугольник все еще будет там.

Так что вопросявляется то, как я могу создать что-то в WPF, что позволяет мне

  • Рисование прямоугольника в точке
  • Удаление прямоугольников / точек из холста WPF после более чем 3

Ответы [ 2 ]

9 голосов
/ 24 августа 2010

Вы делаете 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, и пользовательский интерфейс будет автоматически обновляться для отражения изменений.

1 голос
/ 24 августа 2010

Я бы использовал привязку данных wpf для привязки содержимого холста к коллекции прямоугольников, которые вы храните в другом месте. В любом случае вам нужно научиться связывать данные, если вы хотите серьезно заниматься разработкой WPF.

Редактировать: Конечно, вы храните только прямоугольники, привязка данных должна создавать форму для каждого прямоугольника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...