2017-01-27 8 views
2

これは私のシナリオです。私のテーブルの列数は固定されています(例えば2)。最初は可視行が1つしかありませんが、フォーカスが行1の最後の列にあり、ユーザーが 'tab'を押すと2行目が表示されます。UWPアプリケーションでのキーボード操作による行の可視性の変更

私の問題は、編集中にその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> 

.csファイルが

private int lastRowIndex = 1; 

private void showNextLine(object sender, KeyRoutedEventArgs e) 
{ 
    lastRowIndex++; 
    string nextLineName = "SP" + lastRowIndex.ToString(); 
    nextLineName.Visibility = Visibility.Visible; // which causes error because nextLineName is string instead of StackPanel 
} 

ファイルに加えて、私の現在の実装では、50行を作成して、最初は最後の49が見えないようにすることです、と私はへのいずれかの方法に開いていますすべてをより体系的にまたは柔軟にグループ化してください。TextBox

読んでいただきありがとうございます。

+0

あなたが新しい列を追加すると、どのように以下の行はどうですか?列も追加しますか?または、列はフォーカスされた行とタブ付きの行にのみ追加されますか? – AVK

+0

各行には常に固定数の列があります。このシナリオでは、最初の行には2つの列があるため、2番目の行が表示されると2つの列も表示されます。 –

答えて

0

これは最初の部分(50個のスタックパネルがあるので)を簡単に行うことはできませんが、すべてをdictionaryに入れると、キーだけで更新できます。

ここでは手動で行うの辞書部分です:

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

次に、ここでShowNextLineは次のようになります:

private void showNextLine(object sender, KeyRoutedEventArgs e) 
{ 
    lastRowIndex++; 
    // Modify the StackPanel whose key is lastRowIndex; 
    myStackPanels[lastRowIndex] = Visibility.Visible; 
} 
+0

それは私にとって完璧と思われる、それを試してみましょう。また、 'StackPanel'が50個必要なので、対応する' XAML'コードを効率的に生成する方法はありますか? –

2

あなたは親の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 Childrenプロパティを使用して、いくつかの基本的なLINQ:

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

にはどうすれば動的のStackPanelを作成することができますか?このよう

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); 
+0

どのようにStackPanelを動的に作成できますか?私は実行時間中にそれを縛ることができます。レスポンスありがとう。 –

+0

私の編集した答えを見てください。 – mm8

関連する問題