2013-09-13 6 views
2

для обзора заказа У меня есть список нескольких заказов с разными приоритетами. Они достигают от -10 => очень высокого приоритета до +20 => низкого приоритета. Основываясь на этом приоритете, я хочу динамически возвращать кисть Gradient.Динамический градиентный фон на основе значения int

Например:

  • От -10 до -0,5 она должна исчезать из его Darkred в оранжевый
  • От -0,5 до +0,5 она должна исчезать из оранжевого на желтый в известь
  • От + От 0,5 до +10 он должен исчезать от лайма до зеленого

Я никогда не делал этого раньше и абсолютно не знал, как это решить. Даже если у вас нет полного решения для меня, было бы очень приятно дать мне подсказку.

С уважением Johannes

+1

Учитывая это и комментарии я не 100 % уверен, действительно ли вы хотите вернуть градиент или, скорее, один цвет за раз, что является результатом интерполяции, например между красным и оранжевым. Если приоритет равен «0.0», вы хотите вернуть градиент между оранжевым и извести или * сплошным сплошным * цветом, который находится на полпути между оранжевым и извести? – pbalaga

+0

Мне жаль, что мой вопрос может ввести в заблуждение. Я хочу вернуть один цвет за определенный приоритет. Когда у вас есть список заказов, заказанных prio, он должен появиться в цветовом переходе Gradient. –

ответ

0

Вы можете либо сделать какой-нибудь фанковый алгоритм, чтобы сказать вам, существуют ли приоритеты или нет, и добавить градиент, соответственно вычисляя положение каждого градиента по мере необходимости, или создать прямоугольную область для каждого приоритета, а затем добавить градиент, используя следующий метод. См system.windows.media.lineargradientbrush и WPF Brushes Overview

В XAML

<Rectangle Width="200" Height="100"> 
    <Rectangle.Fill> 
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> 
     <GradientStop Color="Yellow" Offset="0.0" /> 
     <GradientStop Color="Red" Offset="0.25" /> 
     <GradientStop Color="Blue" Offset="0.75" /> 
     <GradientStop Color="LimeGreen" Offset="1.0" /> 
    </LinearGradientBrush> 
    </Rectangle.Fill> 
</Rectangle> 

затем в C#

Rectangle diagonalFillRectangle = new Rectangle(); 
diagonalFillRectangle.Width = 200; 
diagonalFillRectangle.Height = 100; 

// Create a diagonal linear gradient with four stops. 
LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush(); 
myLinearGradientBrush.StartPoint = new Point(0,0); 
myLinearGradientBrush.EndPoint = new Point(1,1); 
myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.Yellow, 0.0)); 
myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.Red, 0.25));     
myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.Blue, 0.75));   
myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.LimeGreen, 1.0)); 

// Use the brush to paint the rectangle. 
diagonalFillRectangle.Fill = myLinearGradientBrush; 
1

Если вы хотите использовать кисти в XAML, может быть DataTrigger является то, что вы хотите.

С триггерами вы можете динамически изменять стили. В этом примере я меняю заливки прямоугольника свойства, на основе приоритета стоимости недвижимости:

<Grid> 
    <Grid.Resources> 

    <LinearGradientBrush x:Key="HighPriorityBrush" EndPoint="1,0.5" StartPoint="0,0.5"> 
     <GradientStop Color="DarkRed" /> 
     <GradientStop Color="Orange" Offset="1" /> 
    </LinearGradientBrush> 

    <LinearGradientBrush x:Key="NormalPriorityBrush" EndPoint="1,0.5" StartPoint="0,0.5"> 
     <GradientStop Color="Orange" /> 
     <GradientStop Color="Yellow" Offset="0.5" /> 
     <GradientStop Color="Lime" Offset="1" /> 
    </LinearGradientBrush> 

    <LinearGradientBrush x:Key="LowPriorityBrush" EndPoint="1,0.5" StartPoint="0,0.5"> 
     <GradientStop Color="Lime" /> 
     <GradientStop Color="Green" Offset="1" /> 
    </LinearGradientBrush> 
    </Grid.Resources> 

    <Rectangle Height="150" Width="150"> 
     <Rectangle.Style> 
     <Style TargetType="Rectangle"> 
      <Style.Triggers> 
      <DataTrigger Binding="{Binding Priority}" Value="0"> 
       <Setter Property="Fill" Value="{StaticResource LowPriorityBrush}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Priority}" Value="1"> 
       <Setter Property="Fill" Value="{StaticResource NormalPriorityBrush}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Priority}" Value="2"> 
       <Setter Property="Fill" Value="{StaticResource HighPriorityBrush}" /> 
      </DataTrigger> 
      </Style.Triggers> 
     </Style> 
     </Rectangle.Style> 
    </Rectangle> 
    </Grid> 

И Приоритетное свойство из ViewModel возвращает что-то вроде этого:

private double realPriority; // your priority 
public double Priority 
{ 
    get 
    { 
    if (this.realPriority < -0.5) return 0; 
    if (this.realPriority > 0.5) return 2; 
    return 1; 
    } 
} 
+0

Проблема в том, что я не хочу только темно-красного или красного цвета в качестве фиксированного цвета. Я хочу, чтобы красное затухание стало оранжевым. Закрывает его. Приходит к 0. В настоящее время у меня также есть тот же код, что и вы выше.:) –

+0

О, извините за непонимание. Теперь я понимаю. В этом случае вам нужно связать свойство «Приоритет» с Background/Fill вашего элемента управления, а затем создать «IValueConverter», чтобы магически преобразовать double в 'LinearGradientBrush' :) –

+0

Да, но как выглядит этот конвертер? –

Смежные вопросы