在代码后面创建一个动态大小的WPF对象

时间:2018-02-27 13:54:17

标签: c# wpf

我想在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;稍后我也需要调整大小事件。但首先我需要能够绘制它一次)。

I can't get the width in the code behind

i should look like this

1 个答案:

答案 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... } 属性。