UWP:在 C# 代码中更改 ListBoxItem 元素的(文本)样式

UWP: changing the (text) style of a ListBoxItem Element in c# code

我有一个列表框,里面有很多列表框项。这些项目只包含文本元素。 我想要做的是更改 c# 代码中单个列表框项的文本样式(可能还有背景颜色)(因为我需要应用条件)。我该怎么做?

XAML:

<ListBox x:Name="todoList" Margin="5, 5, 5, 5" Grid.Row="1" SelectionChanged="todoList_SelectionChanged"/>

我通过解析文件然后将项目添加到列表框来填充列表框。

ItemControlStyleSelector 的子类化在我的案例中似乎不起作用,因为您无法在 UWP 案例中覆盖 SelectStyle 函数。

我可以通过以下方式将样式应用于整个列表框(所有 ListBoxItems):

Style st = new Style();
st.TargetType = typeof(ListBoxItem);
st.Setters.Add(new Setter(ListBoxItem.BackgroundProperty, "Blue"));
todoList.ItemContainerStyle = st;

在代码中仅更改一个项目的样式的好方法是什么?目标是在用户按下键盘上的特定按钮/键后对某些项目应用一些样式。

谢谢!

ListBox 不提供更改特定 ListBoxItem 样式的内置支持。

解决方法是使用 VisualTreeHelper:

XAML:

    <ListBox x:Name="todoList">
        <ListBoxItem>Item#1</ListBoxItem>
        <ListBoxItem>Item#2</ListBoxItem>
        <ListBoxItem>Item#3</ListBoxItem>
        <ListBoxItem>Item#4</ListBoxItem>
        <ListBoxItem>Item#5</ListBoxItem>
    </ListBox>

C#:

public void OnClick(Object sender, RoutedEventArgs e)
{
    var results = new List<ListBoxItem>();

    FindChildren(results, todoList);

    results[2].Background = new SolidColorBrush(Color.FromArgb(120, 0, 0, 255));
}

internal static void FindChildren<T>(List<T> results, DependencyObject startNode) where T : DependencyObject
{
    int count = VisualTreeHelper.GetChildrenCount(startNode);

    for (int i = 0; i < count; i++)
    {
        DependencyObject current = VisualTreeHelper.GetChild(startNode, i);
        if ((current.GetType()).Equals(typeof(T)) || (current.GetType().GetTypeInfo().IsSubclassOf(typeof(T))))
        {
            T asType = (T)current;
            results.Add(asType);
        }

        FindChildren<T>(results, current);
    }
}