以编程方式从 Windows Phone 8.1 XAML 中的 ListView 中的特定 ListViewItem 到达 TextBlock
Posted
技术标签:
【中文标题】以编程方式从 Windows Phone 8.1 XAML 中的 ListView 中的特定 ListViewItem 到达 TextBlock【英文标题】:Reach a TextBlock from a specific ListViewItem from the ListView in Windows Phone 8.1 XAML programmatically 【发布时间】:2014-10-17 09:48:30 【问题描述】:我是 Windows Phone 8.1 的新开发人员,我正在尝试从 ListView 集合中获取特定的 ListView 项目,并能够为其着色或为其内部的 TextBock 着色,但我无法到达该项目或到达ListView 中的任何项目,请查看我的以下代码:
protected async override void OnNavigatedTo(NavigationEventArgs e)
SQLiteRT db1 = new SQLiteRT();
var db_connection = await db1.Connection("MyDB.sqlite");
List<MyTBL> t_list = db1.GetTable("SELECT * FROM MyTBL LIMIT 4 ORDER BY RANDOM() ;");
db_connection.Close();
LV_Options.ItemsSource = t_list;
// my List View called LV_Options
private void LV_Options_SelectionChanged(object sender, SelectionChangedEventArgs e)
ListView lv1 = sender as ListView;
if (lv1 == null)
return;
MyTBL wrd = lv1.SelectedItem as MyTBL;
if (wrd == null)
return;
TextBlock tb = lv1.FindName("TB_AMean1") as TextBlock;
tb.FontSize = 17; // here I got debug error (it not worked !!!!!!!)
var item = LV_Options.Items.ElementAt(3); // this seems not work also !!!!
item.BackColor = Color.LightSteelBlue;
正如您在上面看到的,我尝试通过 LV_Options.Items.ElementAt(3) 到达特定项目,但它不起作用!我也尝试从选定的列表视图项中访问 TextBlock,但也没有成功!
(更新) XAML 代码:
<!-- Title Panel -->
<StackPanel Grid.Row="0" Margin="19,0,0,0">
<TextBlock Name="TB_Rslt" Text="Here result of your answer" Style="ThemeResource TitleTextBlockStyle" Margin="0,12,0,0"/>
<TextBlock Text="page title" Margin="0,-6.5,0,26.5" Style="ThemeResource HeaderTextBlockStyle" CharacterSpacing="ThemeResource PivotHeaderItemCharacterSpacing"/>
</StackPanel>
<!--TODO: Content should be placed within the following grid-->
<Grid Grid.Row="1" x:Name="ContentRoot" Margin="19,10,19,15">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Name="TB_Question" Text="Choose Answer " Margin="0,0,25,0" HorizontalAlignment="Right" FontWeight="Bold" FontSize="22" FontFamily="Verdana" RenderTransformOrigin="0.5,0.5" />
<TextBlock Name="TB_EnWord" Text="" Margin="90,0,15,0" HorizontalAlignment="Left" FontWeight="Bold" FontSize="22" FontFamily="Verdana" RenderTransformOrigin="0.5,0.5" TextAlignment="Right" />
<StackPanel Grid.Row="1" Margin="5,22,0,0">
<ListView Name="LV_Options" SelectionChanged="LV_Options_SelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="6">
<StackPanel VerticalAlignment="Top" Margin="10,0,0,0">
<TextBlock Name="TB_AMean1" Text="Binding AMean1" TextWrapping="Wrap"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
<Button Name="Btn_Answer" Content="Ansewr" HorizontalAlignment="Left" Grid.Row="1" VerticalAlignment="Bottom" Click="Btn_Answer_Click"/>
我的应用程序是一个测验应用程序,它为每个问题提供 4 个选项/选项作为答案,当用户选择一个真实答案时,我想通过将其背景设为绿色来突出显示真实答案(真实选择),如果用户选择了错误的答案/选项我想将该答案(特定列表视图项)的背景设为红色。
有什么帮助吗?
【问题讨论】:
您需要使用您想要更改的属性使用 Observable Collection 填充您的 ItemsSource。除非您引发 INofityEvent,否则它不会改变。 请参阅***.com/questions/25070203/… 了解 Observable Collection 和背景突出显示的示例。 我想给正确的选项上色,而不仅仅是选中的选项! @BasharAbuShaman 嗯,您可以修改该代码以完全按照您的意愿行事。我只建议你看看它,这样你就可以理解为什么你的 UI 没有更新。在您的代码中,您需要通知 ListView 项目已更改。这不是使用 OnPaint - Refresh() 进行常规 win32/winforms 编程,您必须遵守他们的规则。 【参考方案1】:您将无法像这样访问数据模板中的元素。相反,利用绑定到视图模型来设置颜色和其他与视图相关的属性。首先,为您的数据类创建一个包装视图模型:
public class MyTBLViewModel : INotifyPropertyChanged
public MyTBL Entity
get return _entity;
private readonly MyTBL _entity;
public Brush Highlight
get return _brush;
set
_brush = value;
RaisePropertyChanged("Highlight");
private Brush _highlight;
public double ItemFontSize
get return _itemFontSize;
set
_itemFontSize = value;
RaisePropertyChanged("ItemFontSize");
private Brush _itemFontSize;
public MyTBLViewModel(MyTBL entity)
_entity = entity;
_highlight = new SolidColorBrush(Colors.Transparent);
_itemFontSize = 12;
public event PropertyChangedEventArgs PropertyChanged;
protected void RaisePropertyChanged(string propName)
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propName));
将此用作您的ItemsSource
:
List<MyTBLViewModel> t_list = db1.GetTable("SELECT * FROM MyTBL LIMIT 4 ORDER BY RANDOM() ;")
.AsEnumerable().Select(entity => new MyTBLViewModel(entity)).ToList();
现在在您的视图中,将视图元素绑定到“Highlight”和“ItemFontSize”,以及您喜欢的任何其他属性:
<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="6" Background="Binding Highlight">
<StackPanel VerticalAlignment="Top" Margin="10,0,0,0">
<TextBlock Name="TB_AMean1" Text="Binding Entity.AMean1" TextWrapping="Wrap"
FontSize="Binding ItemFontSize"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
最后,您可以从SelectionChangedEventArgs
获取数据项——使用它来更新您的视图相关属性:
private void LV_Options_SelectionChanged(object sender, SelectionChangedEventArgs e)
foreach (var item in e.AddedItems.OfType<MyTBLViewModel>())
item.Highlight = new SolidColorBrush(Color.LightSteelBlue);
item.ItemFontSize = 17;
foreach (var item in e.RemovedItems.OfType<MyTBLViewModel>())
item.Highlight = new SolidColorBrush(Colors.Transparent);
item.ItemFontSize = 12;
【讨论】:
【参考方案2】:var item = LV_Options.Items.ElementAt(3);
此行不正确。它不会返回TextBlock
。我不知道 .BackColor
是什么,它不应该编译。 ListView
中的 Items 属性将返回ListViewItems
的列表。如果要从 ListViewItem
访问内部元素,则需要访问 ContentTemplateRoot
属性。
永远不要使用var
。它让您假设您知道类型,而如果您明确键入声明,您会意识到您做错了。
MyTBL wrd = lv1.SelectedItem as MyTBL;
if (wrd == null)
return;
TextBlock tb = lv1.FindName("TB_AMean1") as TextBlock;
什么是MyTBL
类型? FindName
仅适用于框架 DependencyObjects
所以我假设它是用户控件?您必须提供更多代码来向我们展示您在做什么以及您正在设置 ListView's ItemsSource
和 ItemTemplate
以及这些错误是什么以及您如何一次遇到 2 个重大调试错误以及错误是什么消息是。
理解运行时错误消息是成为一名优秀开发人员的重要组成部分。
【讨论】:
我在上面的问题中添加了 XAML 代码,您可以找到我想要访问的 TextBlock "TB_AMean1" 并以编程方式对其进行修改(修改其颜色和大小),MyTBL 是一个类我在 OnNavigatedTo 函数上将 ListView 与它绑定 是的,我想根据特定的listviewitem到达TextBlock“TB_AMean1”,换句话说,我想从listview到达第三个索引或第二个索引listItem到达TextBlock索引以上是关于以编程方式从 Windows Phone 8.1 XAML 中的 ListView 中的特定 ListViewItem 到达 TextBlock的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows Phone 8.1 中从后台任务启动应用程序
如何在 Windows 8.1 中以编程方式更改当前的 Windows 主题?