更改LongListSelector中TextBlock的前景色

时间:2014-02-03 08:47:50

标签: c# windows-phone-8 textblock foreground longlistselector

我的Windows Phone 8应用程序有一个longlistselector:

<phone:LongListSelector x:Name="AppMenuList" Background="Transparent"
                        ItemTemplate="{StaticResource AppMenuListTemplate}"
                        IsGroupingEnabled="true" HideEmptyGroups="true"
                        LayoutMode="List" SelectionChanged="OnMenuItemTapped"
                        Margin="5,50,0,0"/>

使用以下DataTemplate

<phone:PhoneApplicationPage.Resources>
    <DataTemplate x:Key="AppMenuListTemplate">
        <Grid>
            <StackPanel Orientation="Horizontal" Margin="0,5,0,0" Height="80" Width="800" Tap="vTapFeedback">
                <TextBlock HorizontalAlignment="Left" Margin="0,20,0,20" Height="50"
                           Width="800" TextWrapping="NoWrap"
                           Text="{Binding MenuItemName}" VerticalAlignment="Center"
                           FontSize="32" Foreground="#115445" />
            </StackPanel>
        </Grid>
    </DataTemplate>
</phone:PhoneApplicationPage.Resources>

从我的C#代码中,我为longlistselector设置ItemsSource属性,以向用户显示项目列表。但是,所有项目的颜色与TextBlock属性Foreground中指定的颜色相同。

我有一个要求,我希望用户能够点击列表中的每个项目并执行除一个之外的某些操作。我希望它应该通过使用灰色显示为用户禁用。

我无法做到这一点。谁能建议我怎么做呢?

1 个答案:

答案 0 :(得分:2)

我想到了三种解决方案:

  • 您可以使用VisualTreeHelper查找文本框,然后更改其前景颜色
  • 我已将Foreground颜色绑定到Item Class的属性,然后当我更改此属性时,Foreground会自动更改。我假设你能够绑定你的文本,那么绑定Foreground应该没有问题。您可能需要的一件事是转换器。
  • 您可以在TextBlock的样式中定义VisualStates。

编辑 - 请求后的代码示例

我这样定义了我的转换器:

namespace myApp.Converters
{
   public class BoolToBrush : IValueConverter
   {
    private Brush FalseValue = (Application.Current.Resources["TransparentBrush"] as Brush);
    private Brush TrueValue = (Application.Current.Resources["PhoneAccentBrush"] as Brush);

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return FalseValue;
        else
            return (bool)value ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null ? value.Equals(TrueValue) : false;
    }
 }

在我的Item类中,我有一个属性Selected(在本例中为bool),前景(或背景)绑定到该属性。我在XAML(项目或控件)中使用它,如下所示:

<UserControl.Resources xmlns:local="clr-namespace:myApp.Converters">
    <local:BoolToBrush x:Key="boolToBrush"/>
</UserControl.Resources>
<Grid Name="myElement" Background="{Binding Path=Selected, Converter={StaticResource boolToBrush}}">

当然,您可以定义更多的复合转换 - 如果您需要更多画笔等等 另一方面,我也会考虑使用VisualStates。

希望这有点帮助。