我现在面临着使用列表框时遇到的最常见的问题。虽然我在论坛上找到了很多答案,但似乎没有什么对我有用,否则我就错了。
我已经通过代码创建了一个列表框。每个列表框项都有一个stackpanel,其中有两个文本块。 stackpanel具有垂直方向。文本块的前景已设置为特定颜色。选择或单击某个项目后,它将移至另一个页面,并在新页面结束时返回旧页面。
我的问题是,当单击列表框项目时,它不会显示选择颜色,默认情况下是移动到下一页之前的手机强调颜色。是因为创建列表框时文本块的颜色已经设置了吗?
所以我试着通过这样的SelectionChanged()将它设置为所选项目的前景
ListBoxItem selItem = (ListBoxItem)(listboxNotes.ItemContainerGenerator.ContainerFromIndex(listboxNotes.SelectedIndex));
selItem .Foreground = (SolidColorBrush)Application.Current.Resources["PhoneAccentBrush"];
但这不起作用,我认为它的项目中有一个堆栈面板。
这究竟需要做什么?我是否需要检索stackpanel内的文本块并设置前景?我这里没有使用绑定。 Visual Tree Helper ???
由于
Alfah
答案 0 :(得分:1)
通常,所选颜色在您导航的列表中不会更改。
根据我对android的经验,WP7上没有“选择器”背景。如果您正在寻找一个很酷的UI效果来显示某些动作正在发生,那么TiltEffect
肯定是推荐的,并且非常容易实现。
http://www.windowsphonegeek.com/articles/Silverlight-for-WP7-Toolkit-TiltEffect-in-depth
然而 - 如果你正在创建一个没有即时导航的应用程序,你可能想要一个“选定的”单元格颜色/等等。我附上了一张图片:
如果您在此处注意,按钮与列表中的所选项目相关 - 即。用户可以根据所选项目执行4种不同的操作(但他们必须先选择一项!)。
internal void SelectionChanged()
{
var item = (((ListBoxItem) _view.servers.SelectedItem).Content) as StackPanel;
if (item != null)
{
for (int i = 0; i < _view.servers.Items.Count; i++)
{
var val = (((ListBoxItem) _view.servers.Items[i]).Content) as StackPanel;
var tb = val.Children[0] as TextBlock;
var tb2 = val.Children[1] as TextBlock;
if (i == _view.servers.SelectedIndex)
{
tb.Foreground = tb2.Foreground = (SolidColorBrush) App.Current.Resources["PhoneAccentBrush"];
}
else
{
tb.Foreground = tb2.Foreground = (SolidColorBrush) //regular color here, b/c all these should no longer be selected
}
}
}
}
答案 1 :(得分:1)
ListItemContainer
会自动更改Foreground
。要继承此功能,只需在TextBlock
上指定颜色(或样式)。