Как изменить цвет элемента списка индивидуально программно в silverlight? - PullRequest
1 голос
/ 16 июня 2011

У меня есть чат, похожий на приложение tcp. Я хочу различать цвета отправленных и полученных сообщений. Как я могу сделать это программно? Любая помощь приветствуется

Редактировать Было бы хорошо, если бы я мог изменить цвет строки вместо этого.

Ответы [ 4 ]

1 голос
/ 12 июля 2011

Я сделал пример с привязкой, который использует конвертер стилей.

Вы можете прочитать всю реализацию и пример здесь: http://vanderbiest.org/blog/2011/07/12/listbox-individual-item-color-in-silverlight/

Реализация списка

<listbox itemssource="{Binding Messages}" maxwidth="300" borderbrush="Black" borderthickness="2">
    <listbox.itemtemplate>
        <datatemplate>
                <textblock text="{Binding Name}" style="{Binding IsInError, Converter={StaticResource listboxMessageStyleConverter}}">
        </textblock></datatemplate>
    </listbox.itemtemplate>
</listbox>

Реализация конвертера

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((bool)value)
        {
            return Application.Current.Resources["ListBoxTextNormalItem"];
        }

        return Application.Current.Resources["ListBoxTextErrorItem"];
    }

Реализация стиля

<style x:key="ListBoxTextNormalItem" targettype="TextBlock">
    <Setter Property="Foreground">
        <Setter.Value>
            <SolidColorBrush Color='#0A7B27' />
        </Setter.Value>
    </Setter>
</style>

<style x:key="ListBoxTextErrorItem" targettype="TextBlock">
    <Setter Property="Foreground">
        <Setter.Value>
            <SolidColorBrush Color='#FF2A1B' />
        </Setter.Value>
    </Setter>
    <Setter Property="FontWeight" Value="Bold" />
</style>
1 голос
/ 16 июня 2011

хорошо, сделайте это ..

Создайте класс

 public class MSGS
    {
        public string color {get;set;}
        public string message {get;set;}
    }

сейчас вместо добавления элементов в List<String> создайте List<MSGS> и установите сообщение равным сообщению, и если сообщение отправленозатем установите цвет, скажем, Blue или, если сообщение получено, установите цвет Red.

  MSGS one = new MSGS ();
    one.message = "testing";
    one.color = "Red";

    MSGS two = new MSGS();
    two.message = "testing2";
    two.color = "Blue";

    MSGS three = new MSGS();
    three.message = "testing3";
    three.color = "Red";

    List<MSGS> list = new List<MSGS> ();
    list.Add(one);
    list.Add(two);
    list.Add(three);

    myLB.ItemsSource = list;

определить стиль для listboxitem, как это в XAML

<UserControl.Resources>

    <Style TargetType="ListBoxItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <TextBlock Foreground="{Binding Path=color}"  Text="{Binding Path=message}"/>

                </ControlTemplate>
            </Setter.Value>
        </Setter>

    </Style>

</UserControl.Resources>

этот код будет отображать полученные и отправленные сообщения в разных цветах

ПодробнееДетальный подход попробуйте стиль ниже вместо стиля выше

  <UserControl.Resources>
        <DataTemplate x:Key="DataTemplate1">
            <StackPanel>
                <TextBlock Text="{Binding message}"/>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="DataTemplate2">
            <StackPanel>
                <TextBlock Text="{Binding message}" FontWeight="Bold"/>
            </StackPanel>
        </DataTemplate>

        <Style TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Grid Background="{Binding Path=type}">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To=".35" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="fillColor"/>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Disabled">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To=".55" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="contentPresenter1"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="SelectionStates">
                                    <VisualState x:Name="Unselected"/>
                                    <VisualState x:Name="Selected">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To=".75" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="fillColor2"/>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="contentPresenter1">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Collapsed</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="contentPresenter2">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="FocusStates">
                                    <VisualState x:Name="Focused">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="FocusVisualElement">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Unfocused"/>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Rectangle x:Name="fillColor" Fill="#FFBADDE9" IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1"/>
                            <Rectangle x:Name="fillColor2" Fill="#FFBADDE9" IsHitTestVisible="False" Opacity="0" RadiusY="1" RadiusX="1"/>
                            <ContentPresenter x:Name="contentPresenter1" ContentTemplate="{StaticResource DataTemplate1}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}"/>
                            <ContentPresenter x:Name="contentPresenter2" ContentTemplate="{StaticResource DataTemplate2}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="3,3,0,3" Visibility="Collapsed"/>
                            <Rectangle x:Name="FocusVisualElement" RadiusY="1" RadiusX="1" Stroke="#FF6DBDD1" StrokeThickness="1" Visibility="Collapsed"/>
                            <ListBox HorizontalAlignment="Left" Height="4" Margin="-90,0,0,-163" VerticalAlignment="Bottom" Width="31"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

        </Style>

    </UserControl.Resources>

Взяв это из http://forums.silverlight.net/forums/p/35969/113333.aspx

Если вы хотите узнать больше о стиле, проверьте эти ссылки

http://weblogs.asp.net/scottgu/pages/silverlight-tutorial-part-4-using-style-elements-to-better-encapsulate-look-and-feel.aspx

http://www.silverlightshow.net/items/Skinning-and-Styling-Silverlight-Controls.aspx

1 голос
/ 16 июня 2011

Вы можете изменить текст переднего плана элемента.

item.foreground = new SolidColorBrush(Colors.Green);

0 голосов
/ 16 июня 2011

Посмотрите на следующую ссылку; http://forums.create.msdn.com/forums/p/74900/455850.aspx Имеется рабочее решение по изменению цвета переднего плана выбранного элемента. Поэтому, когда вы получаете сообщение, вы помечаете его как выделенный элемент со стилем, вы можете изменить цвет текста на переднем плане.

...