我一直在努力实现它。在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;
}