在代码隐藏中设置WPF对象的动态大小
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在代码隐藏中设置WPF对象的动态大小相关的知识,希望对你有一定的参考价值。
我目前正在尝试设计一个如下所示的条形图:每行的行数和条数可能因我的图表依赖的dataTable而异。 (差距不是意图,但不是我的问题atm)
我试图通过使用网格来实现我的BarChart。我的DataTable为我提供了一个Key,一个Length,一个Name和一个Parent(这是右边栏的键,因为每行只是将右边的栏分成更小的栏)。
网格大小目前基于我的maingrid,它在XAML-ViewModel中设置为900 * 400。我的酒吧目前设置为他们的长度/ MaxLength * GridLength(而第一个Bar总是MaxLength)并且有一个保证金,因为我希望他们从右到左。我的问题是,我希望这个网格的大小是动态的,但是如果我没有为我的MainGrid设置固定的大小,我的网格的大小是NaN或0。
我删除了一些非常令人困惑的部分,但基本上这是我的代码背后:
public MainWindow()
{
InitializeComponent();
myTable = new DataTable();
}
InitChart(DataTable dt) //Is called from another class when the DataTable changes
{
Maingrid.Children.Clear(); //Dispose old BarChart
myTable = dt;
Grid grid1 = new Grid();
grid1.Width = MainGrid.Width;
grid1.Height = MainGrid.Height;
// Create Rows
int Pa = -1;
foreach (DataRow rw in myTable.Rows)
{
if (Pa != (int)rw["Parent"])
{
RowDefinition rdef = new RowDefinition();
rdef.Height = new GridLength(20);
grid.RowDefinitions.Add(rdef);
}
Pa = (int)rw["Parent"];
}
foreach (DataRow row in myTable.Rows)
{
int P = (int)row["Parent"];
foreach (DataRow rw in myTable.Rows)
{
if ((int)rw["Parent"] == P) //Each row splits the right bar of the previous row, all bars in one row have the previous split bar as their Parent. I draw all Bars with the same Parent in one Row.
{
if ((int)rw["Val"] != 0) //Some Bars are disabled or 0. I don't draw them
{
Rectangle rect = new Rectangle();
double L = rw["Val"]; //The Value of one Bar
rect.Width = L / nMaxValue * grid.Width; //Calculate width of my Rectange based on the maximal value one bar can have
rect.Height = 20; //Just a height
rect.Margin = new Thickness( grid.Width - nRowValue/nMaxValue * grid.Width, 0, 0, 0); //Margin to display the bars next to each other
rect.Fill = Col;
rect.HorizontalAlignment = HorizontalAlignment.Left; //Although i want to have my BarChart go from right to left, I align all bars from on the left and then move them with my margin
Grid.SetRow(rect, y);
nRowValue = nRowValue - (int)rw["Val"];
grid1.Children.Add(rect);
}
}
}
}
MainGrid.Children.Add(grid1);
}
XAML:
<UserControl x:Class="WpfApp.MainWindow"
<Grid x:Name="MainGrid" Background="#f0f0f0" Height="400" Width="900" />
</UserControl>
我也尝试过使用ItemsControl,但我似乎无法使用它。
要使大小调整动态,可以使用网格和网格列。 Grid是一个很棒的布局控件,因为它可以使用所有可用空间。只要确保不要在任何时候设置其或其列宽。这样外部控件(如Page或Window)可以控制它使用的空间。
过程:
- 通过查找数据表中的最大长度来确定
maxLength
值。 - 将多个网格列添加到网格中。确保不要设置列宽。以下代码与添加* -column相同,这是我们需要的:
for (int i = 0; i < maxLength; i++) { MyGrid.ColumnDefinitions.Add(new ColumnDefinition()); }
- 对于每个条形,创建矩形但不设置其宽度或边距。而是设置Column和ColumnSpan。例如:
var rectangle = new Rectangle { Fill = new SolidColorBrush(Colors.LightGray), Opacity = 0.5, Margin = new Thickness(0, -10, 0, 0), Height = 66 }; MyGrid.SetColumn(rectangle, (int)maxLength - data.Length); MyGrid.SetColumnSpan(rectangle, data.Length);
希望这可以帮助。如果您遇到任何问题,请告诉我。
以上是关于在代码隐藏中设置WPF对象的动态大小的主要内容,如果未能解决你的问题,请参考以下文章
WPF 在后面的代码中设置 DataTemplate 网格大小(ResourceDictionary)
若依vue实现动态表格,可动态查询条件,控制列的显示隐藏及操作权限
若依vue实现动态表格,可动态查询条件,控制列的显示隐藏及操作权限