【问题标题】:C# UWP create check-list table programmaticallyC# UWP 以编程方式创建清单表
【发布时间】:2021-09-24 10:30:52
【问题描述】:

我有任务要在 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和cokbox的column2的表格。

【问题讨论】:

    标签: c# xaml uwp


    【解决方案1】:

    您可能想做的是创建一个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 忍者的道路上大有帮助:-)。

    【讨论】:

    • 如果我创建一个子文本块我还需要绑定吗?
    【解决方案2】:

    为什么不将 UWP DataGridCheckBox 一起使用?

    XAML

    <toolkit:DataGrid Grid.Column="0"  ItemsSource="{x:Bind myItemsToBind}"
    x:Name="dgwDeviceSPNs" MinWidth="100"
    VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
    HorizontalScrollBarVisibility="Visible"
    VerticalScrollBarVisibility="Visible"
    AlternatingRowBackground="Transparent" 
    AreRowDetailsFrozen="False"
    AreRowGroupHeadersFrozen="True"
    AutoGenerateColumns="False"
    CanUserSortColumns="False"
    CanUserReorderColumns="True"
    RowGroupHeaderPropertyNameAlternative=""
    CanUserResizeColumns="True"         
    MaxColumnWidth="200"
    FrozenColumnCount="0"
    GridLinesVisibility="Horizontal"
    HeadersVisibility="None"
    IsReadOnly="True" 
    RowDetailsVisibilityMode="Collapsed"
    SelectionMode="Single">
    <toolkit:DataGrid.Columns>
     <toolkit:DataGridTemplateColumn MinWidth="10">
      <toolkit:DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
        <StackPanel Orientation="Horizontal" Padding="2">
         <CheckBox ToolTipService.ToolTip="{Binding Name}"  IsChecked="{Binding IsSelected, Mode=TwoWay}" Content="{Binding Name}"></CheckBox> 
         </StackPanel>
        </DataTemplate>
       </toolkit:DataGridTemplateColumn.CellTemplate>
      </toolkit:DataGridTemplateColumn>
     </toolkit:DataGrid.Columns>
    </toolkit:DataGrid>
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2013-11-04
      • 2011-05-05
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      相关资源
      最近更新 更多