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);
}
}
我有一个列表框,里面有很多列表框项。这些项目只包含文本元素。 我想要做的是更改 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);
}
}