如何在 WPF 中动态添加和定位 CheckBox 元素?
How do I dynamically add and position CheckBox elements in WPF?
我开始制作一个 WinForms 应用程序来显示 4×4×4 复选框的网格,代表现实生活中的 43 个 LED 网格。
这是现在的样子:
我想将其转换为 WPF 应用程序,以便我可以使用 WPF 复选框的透明度选项,使复选框的未选中层 [将有 4 层] 稍微透明,给它更真实的3D感觉。
我是 WPF 的新手,我尝试在主元素中嵌套 2 个元素 Window [例如,2 个网格稍微重叠位置,大约 20 个像素,这样它们看起来是3d-staggered],但它根本不允许我这样做,只允许我在原始网格内添加一个子网格。
TLDR:如何在给它们绝对像素位置的同时动态创建大量复选框?
我当前工作的 WinForms C# 代码:
int spacing = 25;
int zero = 0;
for (int z = 1; z <= 4; z++)
{
List<string> zString = new List<string>();
for (int y = 1; y <= 4; y++)
{
for (int x = 1; x <= 4; x++)
{
int pixel_x = zero + ((x - 1) * spacing);
int pixel_y = (zero - 4) + ((y - 1) * spacing);
//int id = ((y - 1) * 4) + x;
CheckBox box = new CheckBox();
box.CheckStateChanged += new System.EventHandler(checkBox2_CheckedChanged);
box.Tag = id;
zString.Add(id.ToString());
//box.Text = id.ToString();
box.BackColor = Color.Transparent;
//box.
box.AutoSize = false;
box.Size = new Size(20, 20);
box.Padding = new Padding(3);
box.Location = new Point(pixel_x, pixel_y);
this.Controls.Add(box);
id++;
}
}
zero += 25;
}
考虑使用 ItemTemplate(或数据模板)来确定每个项目在您的视图模型集合中的外观。
示例:
<ListBox Width="400" Margin="10"
ItemsSource="{Binding Source={StaticResource myTodoList}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=TaskName}" />
<TextBlock Text="{Binding Path=Description}"/>
<TextBlock Text="{Binding Path=Priority}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我会使用多个 UniformGrid
在规则网格内相互堆叠(因此它们重叠)。每个 UniformGrid 的上边距和左边距都会偏移特定数量。
每个 UniformGrid 的项目源将绑定到每个 "layer" 的视图模型上的布尔属性列表。
你可以试试这个。在 Window.
中使用 Canvas
<Window x:Name="myWindow1" x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Canvas x:Name="canvas" >
</Canvas>
与 Windows 表格中可用的位置不同,您可以使用边距来设置位置
int spacing = 100;
int zero = 0;
for (int z = 1; z <= 4; z++)
{
List<string> zString = new List<string>();
for (int y = 1; y <= 4; y++)
{
for (int x = 1; x <= 4; x++)
{
int pixel_x = zero + ((x - 1) * spacing);
int pixel_y = zero + ((y - 1) * spacing);
CheckBox box = new CheckBox();
Canvas.SetLeft(box, pixel_x);
Canvas.SetTop(box, pixel_y);
this.canvas.Children.Add(box);
}
}
zero = zero + 50;
}
我开始制作一个 WinForms 应用程序来显示 4×4×4 复选框的网格,代表现实生活中的 43 个 LED 网格。
这是现在的样子:
我想将其转换为 WPF 应用程序,以便我可以使用 WPF 复选框的透明度选项,使复选框的未选中层 [将有 4 层] 稍微透明,给它更真实的3D感觉。
我是 WPF 的新手,我尝试在主元素中嵌套 2 个元素 Window [例如,2 个网格稍微重叠位置,大约 20 个像素,这样它们看起来是3d-staggered],但它根本不允许我这样做,只允许我在原始网格内添加一个子网格。
TLDR:如何在给它们绝对像素位置的同时动态创建大量复选框?
我当前工作的 WinForms C# 代码:
int spacing = 25;
int zero = 0;
for (int z = 1; z <= 4; z++)
{
List<string> zString = new List<string>();
for (int y = 1; y <= 4; y++)
{
for (int x = 1; x <= 4; x++)
{
int pixel_x = zero + ((x - 1) * spacing);
int pixel_y = (zero - 4) + ((y - 1) * spacing);
//int id = ((y - 1) * 4) + x;
CheckBox box = new CheckBox();
box.CheckStateChanged += new System.EventHandler(checkBox2_CheckedChanged);
box.Tag = id;
zString.Add(id.ToString());
//box.Text = id.ToString();
box.BackColor = Color.Transparent;
//box.
box.AutoSize = false;
box.Size = new Size(20, 20);
box.Padding = new Padding(3);
box.Location = new Point(pixel_x, pixel_y);
this.Controls.Add(box);
id++;
}
}
zero += 25;
}
考虑使用 ItemTemplate(或数据模板)来确定每个项目在您的视图模型集合中的外观。
示例:
<ListBox Width="400" Margin="10"
ItemsSource="{Binding Source={StaticResource myTodoList}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=TaskName}" />
<TextBlock Text="{Binding Path=Description}"/>
<TextBlock Text="{Binding Path=Priority}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我会使用多个 UniformGrid
在规则网格内相互堆叠(因此它们重叠)。每个 UniformGrid 的上边距和左边距都会偏移特定数量。
每个 UniformGrid 的项目源将绑定到每个 "layer" 的视图模型上的布尔属性列表。
你可以试试这个。在 Window.
中使用 Canvas<Window x:Name="myWindow1" x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Canvas x:Name="canvas" >
</Canvas>
与 Windows 表格中可用的位置不同,您可以使用边距来设置位置
int spacing = 100;
int zero = 0;
for (int z = 1; z <= 4; z++)
{
List<string> zString = new List<string>();
for (int y = 1; y <= 4; y++)
{
for (int x = 1; x <= 4; x++)
{
int pixel_x = zero + ((x - 1) * spacing);
int pixel_y = zero + ((y - 1) * spacing);
CheckBox box = new CheckBox();
Canvas.SetLeft(box, pixel_x);
Canvas.SetTop(box, pixel_y);
this.canvas.Children.Add(box);
}
}
zero = zero + 50;
}