【问题标题】:Change the foreground color of a TextBlock in the LongListSelector更改 LongListSelector 中 TextBlock 的前景色
【发布时间】:2014-02-26 16:17:43
【问题描述】:

我的 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 中指定的颜色相同。

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

我无法做到这一点。谁能建议我如何做到这一点?

【问题讨论】:

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


    【解决方案1】:

    我想到了三个解决方案:

    • 您可以使用 VisualTreeHelper 找到您的文本框,然后更改其前景色
    • 我已将前景色绑定到项目类的属性,然后当我更改此属性时,前景色会自动更改。我假设你能够绑定你的文本,那么绑定前景应该没有问题。您可能需要一个转换器。
    • 您可以在 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),Foreground(或 Background)绑定到该属性。我在 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。

    希望这会有所帮助。

    【讨论】:

    • 我还尝试将 Foreground 绑定到项目类的属性,但我没有成功。您能否按照您的建议使用Converter 类帮助我完成此操作。
    猜你喜欢
    • 2013-08-30
    • 2011-11-25
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多