如何在WPF中动态添加和定位CheckBox元素?

时间:2015-04-02 17:48:28

标签: c# wpf checkbox

我开始制作一个WinForms应用程序来显示一个4×4×4复选框的网格,代表一个真实的4 3 网格LED。

这就是它现在的样子:

我想将其转换为WPF应用程序,以便我可以使用WPF Checkbox的透明度选项,使非选定图层[将有4层]的复选框略微透明,为其提供更多真正的3D感觉。

我是WPF的新手,我试图在主窗口中嵌套2个元素[例如,2个网格略微重叠位置,可能是20个像素,这样它们看起来像是三维交错的],但是它根本不会让我这样做,只允许我在原始网格中添加子网格。

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;
          }

3 个答案:

答案 0 :(得分:0)

考虑使用ItemTemplate(或DataTemplate)来确定每个项目在viewmodel集合中的外观。

示例:

<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>

答案 1 :(得分:0)

我会在常规网格内使用多个UniformGrid堆叠在一起(因此它们重叠)。每个UniformGrid的顶部和左侧边距都会偏移特定的数量。

每个UniformGrid的项目源将绑定到视图模型上每个&#34;层的布尔属性列表&#34;。

答案 2 :(得分:-1)

你可以试试这个。在窗口中使用画布。

<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;
}