以编程方式从 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 ItemsSourceItemTemplate 以及这些错误是什么以及您如何一次遇到 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 Phone 8.1

如何在 Windows 8.1 中以编程方式更改当前的 Windows 主题?

在C#Windows phone 8.1中生成.vcf卡/名片的二维码

Windows phone 8.1 裁剪图像

Windows Phone 8.1 - 从后台任务创建 WriteableBitmap 时出现异常