我想在wpf中使用网格绘制条形图。 由于设计问题,我创建了一个包含6个预定义行的网格,但如果需要可以添加更多行。
作为酒吧,我也想使用网格(矩形也可能,但我想稍后在其中写文字,到目前为止网格更容易)
所有彼此相邻的条形将是主网格尺寸的100%,而它上面的每个条形仅仅是它们组合值的断裂(以%表示)。每个酒吧都在它们自己的行中,两者之间有一个小的间隙。
我很难找到一种方法来将我的酒吧大小设置为主网格大小的百分比。
到目前为止,我的代码看起来像这样:
XAML:
<Window x:Class="BarChart.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:BarChart"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid Height="Auto" Width="Auto">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Name="MainGrid">
<Grid.RowDefinitions>
<RowDefinition Height="4"/>
<RowDefinition/>
<RowDefinition Height="4"/>
<RowDefinition/>
<RowDefinition Height="4"/>
</Grid.RowDefinitions>
</Grid>
</Grid>
C#:
namespace BarChart
{
/// <summary>
/// tbd
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
int counter = 1;
int counter_c = 0;
double[] values = { 656, 333, 812 };
SolidColorBrush[] colors = { new SolidColorBrush(Colors.Red), new SolidColorBrush(Colors.Green), new SolidColorBrush(Colors.Blue) };
double maxValue = 0;
foreach (double d in values)
{
maxValue = maxValue + d;
}
InitializeComponent();
foreach (double d in values)
{
if(MainGrid.RowDefinitions.Count > counter)
{
RowDefinition row = new RowDefinition();
MainGrid.RowDefinitions.Add(row);
RowDefinition gap = new RowDefinition();
gap.Height = new GridLength(4);
MainGrid.RowDefinitions.Add(gap);
}
Grid gd = new Grid();
gd.Width = d / maxValue * MainGrid.ActualWidth;
gd.Background = colors[counter_c];
Grid.SetRow(gd, counter);
counter += 2;
counter_c++;
MainGrid.Children.Add(gd);
}
}
}
目前高度和宽度(MainGrid.ActualWidth当前为0)似乎都没有设置为任何可用值。我希望我的条形图能够在每个窗口大小的情况下动态缩放(Ofc I&#39;稍后我也需要调整大小事件。但首先我需要能够绘制它一次)。
答案 0 :(得分:1)
看起来你试图在构造函数中找到<Border BorderBrush="Black" BorderThickness="1">
<Grid Height="285" Background="White" >
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="1" MaxHeight="285" VerticalScrollBarVisibility="Auto">
<RichTextBox
x:Name="richtextbox"
Width="341"
VerticalAlignment="Top"
FontSize="14"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
UseLayoutRounding="False"
VerticalScrollBarVisibility="Auto"
Block.TextAlignment="Center"
Grid.ColumnSpan="2"
HorizontalAlignment="Left"
BorderThickness="0">
<FlowDocument>
<Paragraph>
This is flow content and you can
<Bold>edit me!</Bold>
</Paragraph>
</FlowDocument>
</RichTextBox>
</ScrollViewer>
</Grid>
</Border>
,这可能是在视觉创建控件之前。要解决此问题,请挂钩MainGrid.ActualWidth
事件并将逻辑放在那里。
ContentRendered
public MainWindow()
{
this.ContentRendered += MainWindow_ContentRendered;
InitializeComponent();
}
private void MainWindow_ContentRendered(object sender, EventArgs e)
{
// Your Logic here...
}
没有此活动,但您可以使用UserControls
活动。
Loaded
创建控件后,这些事件将触发,您将能够看到具有适当值的public YourUserControl()
{
this.Loaded += YourUserControl_Loaded;
InitializeComponent();
}
private void YourUserControl_Loaded(object sender, RoutedEventArgs e)
{
// Your Logic here...
}
属性。