2010-01-07 18 views
1

J'essaie de trouver un moyen de transformer une cellule individuelle en une lueur de datagrid.Lueur de grille de données Silverlight

Je sais que vous pouvez appliquer un dropshadoweffect comme celui-ci à l'ensemble du réseau:

[data:DataGrid.Effect> 
    [DropShadowEffect BlurRadius="100" ShadowDepth="0" Color="Red"/> 
[/data:DataGrid.Effect> 

mais ce que je veux vraiment faire est d'avoir la cellule individuelle lueur rouge lorsque la valeur est> = à 100. Il est un peu d'une gentillesse visuelle pour trier le blé de la balle d'une grande grille.

Répondre

2

J'ai eu une exigence similaire il n'y a pas longtemps que je résolu comme suit:

DataGrids peuvent être basés sur un modèle bien sûr, donc en gros je templated les colonnes comme suit et avait un convertisseur qui peint l'arrière-plan de mon widget en fonction aux données liées à cette cellule.

<data:DataGridTemplateColumn Header="Overall"> 
        <data:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Border Effect="{StaticResource StatusBorderDropShadow}" 
           Background="{Binding Overall, Converter={StaticResource MiniStatusLightConverter}, Mode=TwoWay}" 
           Style="{StaticResource StatusBorder}" >          
           <Border.BorderBrush> 
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
             <GradientStop Color="Black" Offset="0"/> 
             <GradientStop Color="#FF0D9C3B" Offset="1"/> 
            </LinearGradientBrush> 
           </Border.BorderBrush> 
          </Border> 
       </DataTemplate> 
        </data:DataGridTemplateColumn.CellTemplate> 

Jetez un oeil à l'arrière-plan liant la façon dont il utilise le MiniStatusLightConverter.

Voici le convertisseur, dans votre cas, vous vérifiera si la valeur est> = 100.

> espace de noms MyProject.Converters { public class StatusToBrushConverter: IValueConverter { #region mise en œuvre de IValueConverter

private Dictionary<string, List<Color>> colorsMap; 

public StatusToBrushConverter() 
{ 
    colorsMap = new Dictionary<string, List<Color>> 
       { 
        { "Green", new List<Color> { GetColorFromHexString("#FFC1D7BF"), GetColorFromHexString("#FF21C110"), GetColorFromHexString("#FF074431") } }, 
        { "Yellow", new List<Color> { GetColorFromHexString("#FFF2F3EA"), GetColorFromHexString("#FFD7CB10"), GetColorFromHexString("#FFDEFE00") } }, 
        { "Red", new List<Color> { GetColorFromHexString("#FFF3EEEA"), GetColorFromHexString("#FFC13C10"), GetColorFromHexString("#FFFE1000") } } 
       }; 
} 

public static Color GetColorFromHexString(string s) 
{ 
    s = s.Remove(0, 1); 
    var a = System.Convert.ToByte(s.Substring(0, 2), 16); 
    var r = System.Convert.ToByte(s.Substring(2, 2), 16); 
    var g = System.Convert.ToByte(s.Substring(4, 2), 16); 
    var b = System.Convert.ToByte(s.Substring(6, 2), 16); 
    return Color.FromArgb(a, r, g, b); 
} 

public static string GetColourName(object dtoValue) 
{ 
    try 
    { 
    var str = dtoValue.ToString(); 
    if (str.Contains("#")) 
    { 
     return str.Split('#')[1]; 
    } 
    return str; 
    } 
    catch (IndexOutOfRangeException) 
    { 
    return string.Empty; 
    } 
} 

public object Convert(object dtoValue, Type targetType, object parameter, CultureInfo culture) 
{ 
    return new RadialGradientBrush 
         { 
         RadiusX = 0.784, 
         RadiusY = 0.786, 
         GradientOrigin = new Point(0.88, 0.115), 
         GradientStops = GetGradientStopCollection(GetColourName(dtoValue)), 
         RelativeTransform = GetTransformGroupForEffect() 
         }; 
} 

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    throw new NotImplementedException(); 
} 

#endregion 

public object GetBasicSolidColorBrush(object dtoValue) 
{ 
    var blueBrush = new SolidColorBrush(); 

    if (dtoValue == null) 
    { 
    blueBrush.Color = Colors.White; 
    return blueBrush; 
    } 

    var value = GetColourName(dtoValue); 

    if (value == "Green") 
    { 
    blueBrush.Color = Colors.Green; 
    } 
    else if (value == "Yellow") 
    { 
    blueBrush.Color = Colors.Yellow; 
    } 
    else if (value == "Red") 
    { 
    blueBrush.Color = Colors.Red; 
    } 
    else 
    { 
    blueBrush.Color = Colors.White; 
    } 

    return blueBrush; 
} 

private TransformGroup GetTransformGroupForEffect() 
{ 
    var transform = new TransformGroup(); 
    transform.Children.Add(new ScaleTransform { CenterX = 0.5, CenterY = 0.5 }); 
    transform.Children.Add(new SkewTransform { AngleX = 0.0, AngleY = 0.0, CenterX = 0.5, CenterY = 0.5 }); 
    transform.Children.Add(new RotateTransform { Angle = 4.548, CenterX = 0.5, CenterY = 0.5 }); 
    return transform; 
} 

private GradientStopCollection GetGradientStopCollection(string colorValue) 
{ 
    var gradientStopCollection = new GradientStopCollection(); 

    var stop1 = new GradientStop { Offset = 0.0 }; 
    var stop2 = new GradientStop { Offset = 0.200 }; 
    var stop3 = new GradientStop { Offset = 0.858 }; 

    stop1.Color = colorsMap[colorValue][0]; 
    stop2.Color = colorsMap[colorValue][1]; 
    stop3.Color = colorsMap[colorValue][2]; 

    gradientStopCollection.Add(stop1); 
    gradientStopCollection.Add(stop2); 
    gradientStopCollection.Add(stop3); 

    return gradientStopCollection; 
} 

}}

J'espère à le ast cela vous apporte des idées. Une autre approche que j'ai essayée était de créer un contrôle d'utilisateur et de le mettre sur le CellTemplate plutôt que juste la frontière mais j'avais des problèmes et les utilisateurs criaient à moi pour cette fonctionnalité. Cela fonctionne et les utilisateurs sont heureux, ça compte aussi.

J'espère que cela aide