簡體   English   中英

C#Silverlight Datagrid - 行顏色更改

[英]C# Silverlight Datagrid - Row Color Change

你如何改變silverlight數據網格行的顏色?!

我試過這個,但它似乎沒有用,我想要它...隨機行變色不正確:

 void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            var c = e.Row.DataContext as Job;
            if (c != null && c.Status.Contains("complete"))
                e.Row.Background = new SolidColorBrush(Colors.Green);
            else
                e.Row.Background = new SolidColorBrush(Colors.Red);
        }

Microsoft文檔:

為了提高性能,默認情況下EnableRowVirtualization屬性設置為true。 當EnableRowVirtualization屬性設置為true時,DataGrid不會為綁定數據源中的每個數據項實例化DataGridRow對象。 相反,DataGrid僅在需要時才創建DataGridRow對象,並盡可能多地重用它們。 例如,DataGrid為當前處於視圖中的每個數據項創建一個DataGridRow對象,並在它滾出視圖時回收該行。

來源: http//msdn.microsoft.com/en-gb/library/system.windows.controls.datagrid.unloadingrow.aspx

這解釋了您遇到的行為

因此,正確的(雖然不容易讓我承認)解決方案是使用UnloadingRow事件取消設置您設置的樣式。

我有同樣的問題,並在做了一個最小的測試和一些演繹推理后想出來了!

基本上解決方案是始終確保您設置背景顏色(或任何樣式)。 不要假設行樣式的任何默認值 我假設默認為白色 - 這是一個合理的假設,但事實並非如此。

更多細節:

看起來運行時在渲染多行時會重用Ro​​w類的實例。 我根本沒有證實這一點,但從似乎必須發生的症狀判斷。

我只有一兩行應該有不同的顏色。 當上下滾動時,我看到隨機顏色的行。

這是我制作的測試課。 每隔五行應該是紅色和斜體。

你會看到一些注釋掉的行(設置默認的非斜體和白色背景)。 隨着這些注釋 - 如果你上下滾動你會看到很多紅色!! 這是因為正在重用行對象。 如果你讓窗戶變小,然后最大化它,一些白色會回來。 可能是垃圾收集器收集行,它認為在使窗口變小之后你將不再需要它。

正如我上面所說,解決方案是始終為默認值指定樣式,並且不假設任何默認值。

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        dataGrid1.ItemsSource = Enumerable.Range(0, 50).Select(x => new Person()
        {
            FirstName = "John",
            LastName = "Smith",
            ID = x,
            Delinquent = (x % 5 == 0)     // every fifth person is 'delinquent'
        });
    }

    private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        var person = (Person)e.Row.DataContext;

        if (person.Delinquent)
        {
            e.Row.Background = new SolidColorBrush(Colors.Red);
            e.Row.Foreground = new SolidColorBrush(Colors.White);
            e.Row.FontStyle = FontStyles.Italic;
        }

        else
        {
           // defaults - without these you'll get randomly colored rows
           // e.Row.Background = new SolidColorBrush(Colors.Green);
           // e.Row.Foreground = new SolidColorBrush(Colors.Black);
           // e.Row.FontStyle = FontStyles.Normal;
        }

    }

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int ID { get; set; }
        public bool Delinquent { get; set; }
    }
}

我是在這之后:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            DataGridRow row = e.Row;
            var c = row.DataContext as Job;         
            if (c != null && c.Status.Contains("omplete"))
                e.Row.Foreground = new SolidColorBrush(Colors.Green);
            else
                e.Row.Foreground = new SolidColorBrush(Colors.Red);
        }

這個對我有用。 =)

private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        var row = e.Row.GetIndex();
        if (row % 2 == 0)
        {
            e.Row.Background = new SolidColorBrush(Colors.Red);
            e.Row.Foreground = new SolidColorBrush(Colors.White);
            e.Row.FontStyle = FontStyles.Italic;
        }

        else
        {
            // defaults - without these you'll get randomly colored rows
            e.Row.Background = new SolidColorBrush(Colors.Green);
            e.Row.Foreground = new SolidColorBrush(Colors.Black);
            e.Row.FontStyle = FontStyles.Normal;
        }
    }

執行此操作的最佳方法是更改​​DataGrid上的RowStyle。 這需要大量的xaml,但你可以從這里復制它並更改其中的一些樣式。

此外,如果需要根據行數更改行顏色,可以在樣式中將綁定添加到數據的Brush屬性中。

他們打開Reflector並從System.Windows.Controls.Data.dll獲取DataGrid的generic.xaml,然后編寫了一些新的xaml來更改它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM