(Реализация этого адреса в лучшем случае является подмножеством этого довольно старого вопроса, поскольку это только один тип диаграммы ...)
Просто попробуйте создать гистограмму в Grid
как Edпредполагает довольно просто.Вот быстрая и грязная версия:
Добавьте Grid
к XAML вашего Window
.Просто для тестирования, вот тот, который полностью заполняет Window
.
<Grid>
<Grid
Name="myGrid"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Width="auto"
Height="auto"
Margin="10,10,10,10"
/>
</Grid>
Теперь вставьте эти две служебные функции где-нибудь в вашем проекте.Они предоставляют простые одноцветные столбцы и не стилизованный, но центрированный текст метки для оси X.
Я думаю, что единственным неприятным ударом является maxHeight
в вызове _placeSingleColorColumn
.
Стоит упомянуть: У меня нет ярлыков для оси Y в этой быстрой и грязной версии.
private void _placeSingleColorColumn(Grid grid, Color color, int height, int colNum, int maxHeight)
{
Brush brush = new SolidColorBrush(color);
Rectangle rect = new Rectangle();
rect.Fill = brush;
Grid.SetColumn(rect, colNum);
Grid.SetRow(rect, maxHeight - height);
Grid.SetRowSpan(rect, height);
grid.Children.Add(rect);
}
private void _createLabels(Grid grid, string[] labels)
{
RowDefinition rowDefnLabels = new RowDefinition();
grid.RowDefinitions.Add(rowDefnLabels);
for (int i = 0; i < labels.Length; i++)
{
TextBlock block = new TextBlock();
block.Text = labels[i];
block.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
Grid.SetColumn(block, i);
Grid.SetRow(block, grid.RowDefinitions.Count);
grid.Children.Add(block);
}
}
Это действительно так.Вот несколько безумно быстрых и грязных примеров кода для создания сетки 10 на 10 с некоторыми примерами данных.
public void createGrid10x10()
{
Random random = new Random();
for (int i=0; i<10; i++)
{
ColumnDefinition colDef = new ColumnDefinition();
myGrid.ColumnDefinitions.Add(colDef);
RowDefinition rowDef = new RowDefinition();
myGrid.RowDefinitions.Add(rowDef);
Color color = i % 2 == 0 ? Colors.Red : Colors.Blue;
_placeSingleColorColumn(this.myGrid, color, random.Next(1,11), i, 10);
}
string[] aLabels = "Dogs,Cats,Birds,Snakes,Rabbits,Hamsters,Horses,Rats,Bats,Unicorns".Split(',');
_createLabels(this.myGrid, aLabels);
}
Добавьте одну строку в ваш MainWindow
конструктор, и все готово, на самом деле.
public MainWindow()
{
InitializeComponent();
this.createGrid10x10();
}
Теперь у вас есть гистограмма, которая будет изменять размеры и оставаться пропорциональной при изменении размера окна и т. Д.
![bar graph resized wider](https://i.stack.imgur.com/YO2Zd.png)
Добавление дополнительных меток(значения столбцов сверху, метки оси Y и т. д.) должны быть довольно простыми, если вы понимаете вышесказанное.Просто добавьте другой столбец и / или строку, создайте TextBlock
s и разместите их в нужных местах.