C#UWP以编程方式创建检查列表

时间:2018-03-26 01:37:04

标签: c# xaml uwp

我有在C#UWP用户创建的检查列表中创建的任务。 但是我从一开始就陷入困境,因为XAML对我来说是新的,所以我不知道从什么开始。 所以,我有文本框可以在列表框中输入标题,任务或子任务(专门添加到)所选任务。

这是我的xaml现在的样子:

<Page
    x:Class="Table1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Table1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid>
        <TextBox x:Name="txt" HorizontalAlignment="Left" Height="71" Margin="71,247,0,0" Text="TextBox" VerticalAlignment="Top" Width="395"/>
        <RadioButton x:Name="title" Content="Add Title" HorizontalAlignment="Left" Margin="71,86,0,0" VerticalAlignment="Top"/>
        <RadioButton x:Name="task" Content="Add Task" HorizontalAlignment="Left" Margin="71,123,0,0" VerticalAlignment="Top"/>
        <RadioButton x:Name="subtask" Content="Add Subtask" HorizontalAlignment="Left" Margin="71,155,0,0" VerticalAlignment="Top"/>
        <ListBox x:Name="listbox" HorizontalAlignment="Left" Height="68" Margin="71,354,0,0" VerticalAlignment="Top" Width="395"/>
        <Button x:Name="btn" Content="Button" HorizontalAlignment="Left" Margin="401,483,0,0" VerticalAlignment="Top" Click="btn_Click"/>
    </Grid>

</Page>

有代码:

public class subtasks
        {
            public string parent { get; set; }
            public string subtask { get; set; }

            public subtasks(string parenti, string subtaski)
            {
                parent = parenti;
                subtask = subtaski;
            }

            public  void setsub(string parenti, string sub)
            {
                parent = parenti;
                subtask = sub;
            }
        }


        List<string> Tasks = new List<string>();
        List<subtasks> sub = new List<subtasks>();

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            string parent = "";
            string Title;
            string Task;
            string Subtask;

            if (title.IsChecked==true)
            {
                Title = txt.Text;
                adding(Title, parent, 1);
            }
            else if (task.IsChecked==true)
            {
                Task = txt.Text;
                adding(Task, parent, 2);
            }
            else if (subtask.IsChecked==true)
            {
                parent = listbox.SelectedItem.ToString();
                Subtask = txt.Text;
                adding(Subtask, parent, 3);
            }
            else
            {

            }
        }

        private void adding(string str, string par, int x)
        {
            subtasks subi = new subtasks(par,str);
            RowDefinition row = new RowDefinition();
            TextBlock text = new TextBlock();
            if (x==1)
            {
                print(str);
            }
            else if (x==2)
            {
                Tasks.Add(str);
                listbox.Items.Add(str);
                text.Text = str;
                print(str);


            }
            else
            {
                sub.Add(subi);
                print(str);
            }
        }

        private void print(string title)
        {
            int step = 0;
            Grid gridwin = new Grid();
            gridwin.Children.Clear();
            RowDefinition row = new RowDefinition();
            TextBlock text = new TextBlock();
            text.Text = title;
            Grid.SetColumn(text, 0);
            Grid.SetRow(text, step);
            step++;


            for (int i = 0; i < Tasks.Count; i++)
            {
                text.Text = Tasks[i].ToString();
                gridwin.Children.Add(text);
                Grid.SetColumn(text, 0);
                Grid.SetRow(text, step);
                step++;
                for (int k = 0; k < sub.Count; k++)
                {
                    if (sub[k].parent == Tasks[i])
                    {
                        text.Text = sub[k].subtask.ToString();
                        gridwin.Children.Add(text);
                        Grid.SetColumn(text, 0);
                        Grid.SetRow(text, step);
                        step++;
                    }
                }
            }
        }

如您所见,每次单击按钮时我都需要清除并放置数据,因此您永远不知道用户何时决定为以前添加的任务添加新的子任务。所以,问题是,如何使用任务和子任务的column1以及chekbox的column2来创建表。

1 个答案:

答案 0 :(得分:0)

您可能要做的是创建DataTemplate。您可以使用它来指定列表项的显示和格式化方式。这样,您可以指定要将其显示为Grid,其中包含两个列,例如描述和CheckBox。请查看documentation,查看DataTemplates的一些示例。您还可以看到Azure Mobile Apps quickstart for UWP,因为虽然它专注于演示Microsoft Azure与UWP的集成,但它实际上是一个待办事项应用程序,它可以为您构建自己的应用程序提供一些灵感。

布局可能如下所示:

<ListBox x:Name="listbox" HorizontalAlignment="Left" Height="68" Margin="71,354,0,0" VerticalAlignment="Top" Width="395">
   <ListBox.ItemTemplate>
      <DataTemplate>
          <Grid>
              <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="*" />
                  <ColumnDefinition Width="Auto" />
              </Grid.ColumnDefinitions>
              <TextBlock Text="{Binding Text}" />
              <CheckBox Grid.Column="1" IsChecked="{Binding IsChecked, Mode=TwoWay}" />
          </Grid>
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

您可以看到我的代码也使用{Binding}语法,您还需要了解一下,以便能够知道用户何时检查了列表中的待办事项。我建议你看一下像here这样的简单教程样本。实际上,数据绑定是构建基于XAML的应用程序时最重要的事情之一,当您理解这个概念时,它将帮助您成为UWP忍者的方式:-)。