C# 在UWP应用程序中通过键盘交互修改行的可见性

C# 在UWP应用程序中通过键盘交互修改行的可见性,c#,wpf,xaml,uwp,C#,Wpf,Xaml,Uwp,这是我的设想。我的表有固定数量的列,比如说2列,最初,它只有一个可见行,但是当焦点在第1行的最后一列上并且用户按下“tab”键时,第2行将变为可见 我的问题是,我无法动态选择要使其可见的行,因为我必须在编译期间指定其x:Name 以下是我目前的工作 .xaml文件 <StackPanel Orientation="Vertical"> <StackPanel Orientation="Horizontal" x:Name="SP1"> <Te

这是我的设想。我的表有固定数量的列,比如说2列,最初,它只有一个可见行,但是当焦点在第1行的最后一列上并且用户按下“tab”键时,第2行将变为可见

我的问题是,我无法动态选择要使其可见的行,因为我必须在编译期间指定其
x:Name

以下是我目前的工作

.xaml文件

<StackPanel Orientation="Vertical">
    <StackPanel Orientation="Horizontal" x:Name="SP1">
        <TextBox Text="1-1"/>
        <TextBox Text="1-2" KeyDown="showNextLine"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal" x:Name="SP2" Visibility="Collapsed">
        <TextBox Text="2-1"/>
        <TextBox Text="2-2"/>
    </StackPanel>
    <!--the remaining rows...-->
</StackPanel>
此外,我目前的实现是创建50行,并使最后49行最初不可见,我愿意使用任何方法来更系统或灵活地对所有
文本框进行分组


感谢阅读。

我想不出一个简单的方法来完成第一部分(因为你有50个堆栈面板),但是如果你把它们都放在一个
字典中,那么你可以只使用键来更新它们

以下是手动完成的字典部分:

Dictionary<int, StackPanel> myStackPanels = new Dictionary<int, StackPanel>();
myStackPanels.Add(1, SP1);
myStackPanels.Add(2, SP2);

您可以为父StackPanel指定一个x:名称,或者在动态创建时保留对它的引用:

<StackPanel x:Name="root" Orientation="Vertical">
    <StackPanel Orientation="Horizontal" x:Name="SP1">
        <TextBox Text="1-1"/>
        <TextBox Text="1-2" KeyDown="showNextLine"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal" x:Name="SP2" Visibility="Collapsed">
        <TextBox Text="2-1"/>
        <TextBox Text="2-2"/>
    </StackPanel>
    <!--the remaining rows...-->
</StackPanel>

添加新列时,下面的行如何?它是否也添加了列?或者,列将只添加到焦点和选项卡的行中?每行中始终有固定数量的列。在这个场景中,第一行有两列,所以当第二行可见时,它也有两列。如何动态创建StackPanel?我只知道我可以在运行时绑定它。谢谢你的回复。它看起来很适合我,让我试试。此外,因为我需要50个
StackPanel
,您知道有什么方法可以高效地生成相应的
XAML
代码吗?
private void showNextLine(object sender, KeyRoutedEventArgs e)
{
    lastRowIndex++;
    // Modify the StackPanel whose key is lastRowIndex;
    myStackPanels[lastRowIndex] = Visibility.Visible;
}
<StackPanel x:Name="root" Orientation="Vertical">
    <StackPanel Orientation="Horizontal" x:Name="SP1">
        <TextBox Text="1-1"/>
        <TextBox Text="1-2" KeyDown="showNextLine"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal" x:Name="SP2" Visibility="Collapsed">
        <TextBox Text="2-1"/>
        <TextBox Text="2-2"/>
    </StackPanel>
    <!--the remaining rows...-->
</StackPanel>
private void showNextLine(object sender, KeyRoutedEventArgs e)
{
    lastRowIndex++;
    string nextLineName = "SP" + lastRowIndex.ToString();
    StackPanel child = root.Children.OfType<StackPanel>().FirstOrDefault(x => x.Name == nextLineName);
    if (child != null)
        child.Visibility = Visibility.Visible;
}
var sp = new StackPanel { Name = "SP3", Orientation = Orientation.Horizontal, Visibility = Visibility.Collapsed };
sp.Children.Add(new TextBlock { Text = "3-1" });
var txt = new TextBlock() { Text = "3-2" };
txt.KeyDown += showNextLine;
sp.Children.Add(txt);
root.Children.Add(sp);