2010-01-07 98 views
1

我正在想辦法讓數據網格內的單個單元格發光。Silverlight數據網格輝光

我知道,你可以申請一個dropshadoweffect這樣對整個電網:

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

但是我真正想要做的是有單個電池亮紅燈當值> = 100。這是有一種視覺上的好處,可以從大網格的穀殼中分揀小麥。

回答

2

我也有類似的要求,不久前我解決如下:

DataGrid中可以作爲模板,當然,所以基本上我模板列如下只好再根據畫我的窗口小部件的背景轉換器到綁定到這個單元格的數據。

<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> 

看一看背景結合它如何使用MiniStatusLightConverter。

這裏是轉換器,你的情況,你會檢查,如果該值> = 100

> 命名空間MyProject.Converters { 公共類StatusToBrushConverter:的IValueConverter { #地區的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; 
} 

}}

我希望在勒這給你帶來了一些想法。我嘗試的另一種方法是創建一個用戶控件,將它放在CellTemplate而不是邊界上,但我遇到了問題,用戶正在尖叫着我這個功能。它的工作原理和用戶都很高興,這也很重要。我希望它有幫助