Я создаю полигоны в коде, которые добавляются в общий ObservableList.Это моя ViewModel.
class CanvasViewModel : ModelBase
{
private WpfObservableRangeCollection<Shape> CanvasShapes { get; set; }
//...
}
Форма - это правильные формы WPF.Нет контейнера или что-нибудь.Кроме того, я установил стиль этих фигур также программно, например:
public void ApplyStyle(Style style)
{
style.Setters.Add(new Setter(Shape.FillProperty, Brushes.DodgerBlue));
}
Как вы можете видеть, я определенно устанавливаю цвет для этих фигур.Моя проблема в том, что в моей программе, когда я запускаю ее, холст визуализируется (я вижу это, когда я устанавливаю фон холста любого цвета), но ни одна из фигур, которые я добавляю в ObservableRangeCollection (они определенно находятся вcollection.)
Вот код страницы для CanvasPage:
<ItemsControl ItemsSource="{Binding CanvasShapes}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Я полагаю, что это правильные формы WPF, и мне не нужно добавлять к ним какие-либо шаблоны данных или что-то еще, однакоЯ думаю, что именно здесь я ошибаюсь.
А вот CodeBehind of the Window, который в настоящее время инициализирует эти функции (я знаю, что это плохая практика, просто запустить программу для тестирования):
public MainWindow()
{
InitializeComponent();
CanvasPage canvasPage = new CanvasPage()
//boilerplate...
var canvasViewModel = new CanvasViewModel(...);
canvasPage.DataContext = canvasViewModel;
this._NavigationFrame?.Navigate(canvasPage);
}
Вот MCV-версия этой проблемы:
Viewmodel.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;
namespace MVCE
{
class ViewModel
{
public ObservableCollection<Shape> CanvasShapes;
public ViewModel()
{
CanvasShapes = new ObservableCollection<Shape>();
var polygon = new Polygon();
var pointCollection = new PointCollection
{
new Point(100, 100),
new Point(100, -100),
new Point(-100, -100),
new Point(-100, 100)
};
polygon.Points = pointCollection;
Style style = new Style();
style.Setters.Add( new Setter(Shape.FillProperty, Brushes.Aquamarine));
polygon.Style = style;
CanvasShapes.Add(polygon);
}
}
}
MainWindow.cs
<Window x:Class="MVCE.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MVCE"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<DockPanel>
<Frame x:Name="_NavigationFrame" NavigationUIVisibility="Hidden" />
</DockPanel>
</Window>
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace MVCE
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ViewModel viewModel = new ViewModel();
var page = new Page1();
page.DataContext = viewModel;
_NavigationFrame.Navigate(page);
}
}
}
CanvasPage.xaml (файл .cs по умолчанию)
<Page x:Class="MVCE.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MVCE"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
Title="Page1">
<ItemsControl ItemsSource="{Binding CanvasShapes}" Background="Brown">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Page>