Как я могу изменить цвет шрифта во время выполнения в wpf? - PullRequest
0 голосов
/ 28 апреля 2011

Я использую VS2010 - WPF - C #, и я строю тикер ценных бумаг, который показывает некоторые значения пользователю в виде списка.

Мой список выглядит так:

<ListView Height="325" Margin="8,8,8,0" x:Name="listView1" VerticalAlignment="Top" BorderThickness="3" FontWeight="Bold" FontSize="12" Foreground="White" Background="{x:Null}" BorderBrush="{x:Null}" Style="{DynamicResource ListViewStyle1}">
  <ListView.View>
    <GridView>
      <GridViewColumn Header="name" DisplayMemberBinding="{Binding company_name}" Width="200" />
      <GridViewColumn Header="symbol" DisplayMemberBinding="{Binding symbol}" Width="50" />
      <GridViewColumn Header="price"  DisplayMemberBinding="{Binding price}" Width="75" />
      <GridViewColumn Header="percent " DisplayMemberBinding="{Binding change_percent}" Width="50" />
    </GridView>
  </ListView.View>
</ListView>

Мне бы хотелось, чтобы некоторые строки в моем списке отображались красным, другие - зеленым, в зависимости от значения процента во время выполнения, но я не знаю, как.

С наилучшими пожеланиями

Ответы [ 2 ]

5 голосов
/ 28 апреля 2011

Чтобы сделать то, что вы ищете, HB ответит .

Однако учтите это с точки зрения удобства использования.Некоторые люди дальтоники и считают, что определенные комбинации шрифтов и цветов фона трудно или невозможно прочитать.Возможно, вам лучше рассмотреть возможность использования цветового эллипса в новом первом столбце и сохранения стандартных цветов фона / переднего плана в соответствии с выбором пользователей в Windows.Подход к настройке фоновой кисти эллипса будет таким же, как и для ответа HB на шрифт.

Даже для людей, не страдающих дальтонизмом, попытка прочитать ярко-зеленый текст на белом фоне может бытьвызов (представьте, например, что эти люди сидели с окном позади них).

Просто мысль.

3 голосов
/ 28 апреля 2011

Свяжите Foreground вашего управления с change_percent и используйте ValueConverter , чтобы превратить его в Brush.

Вот базовый преобразователь, который меняет цвет с красного на желтый и превращается в зеленый:

public class PercentToBrushConverter : IValueConverter
{
    ///2698092/est-li-prostoi-sposob-smeshat-dva-znacheniya-system-drawing-color#2698095
    private Color Blend(Color color, Color backColor, double amount)
    {
        byte r = (byte)((color.R * amount) + backColor.R * (1 - amount));
        byte g = (byte)((color.G * amount) + backColor.G * (1 - amount));
        byte b = (byte)((color.B * amount) + backColor.B * (1 - amount));
        return Color.FromRgb(r, g, b);
    }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //Assumes the percent property to be an int.
        int input = (int)value;
        Color red = Colors.Red;
        Color yellow = Colors.Yellow;
        Color green = Colors.Green;
        Color color;
        if (input <= 50)
        {
            color = Blend(yellow, red, (double)input/50);
        }
        else
        {
            color = Blend(green, yellow, (double)(input - 50) / 50);
        }
        return new SolidColorBrush(color);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Который вы могли бы использовать так:

<ListView>
    <ListView.Resources>
        <vc:PercentToBrushConverter x:Key="PercentToBrushConverter"/>
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Progress">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <!-- An indicator ellipse as suggested by Neil Barnwell -->
                            <Ellipse Height="16" Width="16" Fill="{Binding change_percent, Converter={StaticResource PercentToBrushConverter}}"/>
                            <TextBlock Margin="5,0,0,0" Text="{Binding change_percent}"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <!-- ... -->
        </GridView>
    </ListView.View>
</ListView>

Как сделать объявление xmlns:

Вам необходимо определить класс в некотором пространстве имен:

namespace MySolution.ValueConverters
{
    public class PercentToBrushConverter : IValueConverter { /*...*/ }
}

Это пространство имен может быть отображено в Window или любом другом родительском элементе управления:

<Window ...
    xmlns:vc="clr-namespace:MySolution.ValueConverters">

Отображает пространство имен MySolution.ValueConverters на префикс vc. Для получения дополнительной информации см. MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...