【问题标题】:Create an WPF Object with a dynamic size in code behind在后面的代码中创建具有动态大小的 WPF 对象
【发布时间】:2018-02-27 23:00:01
【问题描述】:

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

【问题讨论】:

  • 也许你想要完成的事情的图像会有所帮助。我不明白为什么你不能只设置Height = "*",如果你想让它们成为一个百分比。
  • 你在说行吗?当然我可以这样做,但我目前的问题是,我仍然很难获得我的主网格的宽度来创建基于它的我的栏。 (添加了一些图片)
  • 我仍然有点困惑,但看起来您正试图在构造函数中执行所有这些逻辑(通常是一种不好的做法)。在构造函数中,这是在您的控件被可视化创建之前(这就是为什么您的MainGrid.ActualWidth = 0。相反,将ContentRendered 事件连接到您的MainWindow。然后在MainWindow_ContentRendered 事件中,执行您的逻辑。在那期间时间,您的MainGrid 将拥有您正在寻找的ActualWidth
  • 对于未来的问题,尝试一次只解决一个问题。这个问题似乎集中在获取 ActualWidth 上。如果是这种情况,那么我可以将我之前的评论移至答案。如果您随后需要有关行的帮助,您应该提出一个单独的问题,重点关注该问题。这个问题最初让我对您面临的具体问题感到困惑,因为您首先说“我很难找到一种方法将我的条形大小设置为我的主网​​格大小的百分比。”
  • 谢谢,这似乎就是我想要的。但现在我需要从另一个 Control 调用“MainChartControl”初始化我的 Control,它使用 DataTable 作为 DependencyProperty 来为我的条形图传递值和颜色。以前,我每次调用 DependencyProperty 的设置器时都尝试使用与上述相同的代码调用方法并且遇到相同的问题(可能是因为那时没有创建我的 MainGrid)。你有什么想法我也可以解决这个问题吗?

标签: c# wpf


【解决方案1】:

看起来您正试图在构造函数中找到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...
    }

这些事件将在创建控件后触发,您将能够看到具有适当值的 ActualWidth 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 2010-12-22
    • 1970-01-01
    • 2023-03-09
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多