Windows Phone 8.1 listview绑定文本框 - 如何设置焦点并调出键盘?

时间:2016-11-15 19:24:46

标签: windows-phone-8.1 windows-store-apps

我一直在努力实现它。在Windows Mobile 6.5等旧版本中很容易。

扫描条形码时,如果条形码已经不在列表中,则应将其添加,并将焦点设置为绑定文本框。

条形码扫描并将扫描的项目添加到列表视图中可以正常工作。 将焦点设置为绑定文本框并调出键盘是不起作用的。

在下面的FocusItem()中,我可以获得对确切框的引用,但它只是不会设置焦点并调出键盘,即使它碰到这一行:

textbox.Focus(FocusState.Keyboard);

另外,我在下面添加的AllChildren(),速度慢得令人无法接受。

我正在拼命寻找实现这一目标的方法。

的Xaml:

<ListView x:Name="listView" Grid.Row="1" Margin="1,0,1,0" 
          ItemsSource="{Binding}" 
          SelectionMode="Multiple"
          DataContextChanged="listView_DataContextChanged"
          Holding="listView_Holding"
          Loaded="listView_Loaded"
          SelectionChanged="listView_SelectionChanged"
          >
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Border Background="{Binding BackGround}" Tag="{Binding RowNumber}">
                <Grid x:Name="row">
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="270"></ColumnDefinition>
                        <ColumnDefinition Width="100"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <StackPanel Grid.Row="1" Grid.Column="1" Orientation="Vertical">
                        <TextBox x:Name="tbQuantity" 
                           Margin="0,0,10,2"
                           Width="80"
                           Text="{Binding Quantity, Mode=TwoWay}" 
                           IsEnabled="{Binding IsEnabled}"
                           FontSize="{StaticResource TextStyleLargeFontSize}"
                           BorderBrush="DarkGray"
                           Foreground="Black"
                           InputScope="NumberFullWidth"
                           Tag="{Binding RowNumber}"
                                 Loaded="tbQuantity_Loaded"
                           TextChanged="tbQuantity_TextChanged"
                           GotFocus="tbQuantity_GotFocus"
                           LostFocus="tbQuantity_LostFocus"
                           RequestedTheme="Light"
                           >
                            <!--<TextBox.Header>Quantity</TextBox.Header>-->
                        </TextBox>
                    </StackPanel>
                </Grid>
            </Border>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

代码隐藏:

private void Barcode_ScanCompleted(object sender, Barcode.BarcodeEventArgs e)
{
    if (e.Data.Trim().Length == 0)
    {
        return;
    }
    SoundMediaElement.Play();
    AddItemByBarcode(e.Data);
}

private async Task<bool> AddItemByBarcode(string barcode)
{
            DataRow lastDataRowUpdated = OriginalSource.AddOrUpdate(barcode);
            await FocusItem(row: lastDataRowUpdated);
}


private async Task FocusItem(DataRow row)
{
        int index = 0;
        foreach (DataRow item in listView.Items)
        {
            if (item.Barcode == row.Barcode)
            {
                break;
            }
            index += 1;
        }

        listView.ScrollIntoView(listView.Items[index]);
            List<Control> controls = AllChildren(((Grid)((Border)((DataTemplate)listView.ItemTemplate).LoadContent()).Child));
            if (controls.Count>0)
            {
                if (controls[0].GetType() == typeof(TextBox))
                {
                    TextBox textbox = controls[0] as TextBox;
                    textbox.Focus(FocusState.Keyboard);
                    //await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => textbox.Focus(FocusState.Keyboard));
                    //textbox.Focus(FocusState.Programmatic);
                }
            }
}

public List<Control> AllChildren(DependencyObject parent)
{
    var _List = new List<Control>();
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var _Child = VisualTreeHelper.GetChild(parent, i);
        if (_Child is Control)
            _List.Add(_Child as Control);
        _List.AddRange(AllChildren(_Child));
    }
    return _List;
}

0 个答案:

没有答案