我正在研究一個由其他人編寫的大型代碼項目,因此我試圖用盡可能小的影響添加更改。它使用System.Windows.Controls.DataVisualization.Toolkit
創建一個LineSeries
合併爲一個MultiChart
的折線圖,這是我的前任創建的一個類。在綁定中循環遍歷顏色
這些線條都是相同的顏色。我被要求讓他們有不同的顏色。或者真的有不止一種顏色。行數不是恆定的,所以我希望循環顯示一系列顏色。那麼我所要做的就是創造一個足夠大的覆蓋大多數案例。
由於行號不一致,我無法明確定義每種顏色。此外,MultiChart
具有SeriesSource
屬性,該屬性是多個LineSeries
的ObservableCollection
,其依次是數據點的ObservableCollection
,其通過綁定到ViewModel來設置。
所以我想我必須將顏色綁定到xaml之外的值。由於它是與視圖相關的工作,我想象後面的代碼將成爲我改變顏色的有效位置,但是我一直無法找到可用於此的解決方案。
我已經看過一些關於SO和其他地方的問題,他們中的任何一個都不管用,或者沒有考慮MVVM模式。我只是在尋找一種可以重新加入MVVM的工作解決方案,但如果這是一種好的做法,也可以得到獎勵。
我一直在使用WPF一段時間,出於某種原因,我無法完全包裹數據綁定,這可能是我爲什麼不能成功解決大部分解決方案。儘管我認爲我接近這一點:
在<UserControl.Resources>
<local:LocalColorConverter x:Key="MyColorConverter"/>
<Style x:Key="dataPointStyle" TargetType="{x:Type charting:LineDataPoint}">
<Setter Property="Background" Value="{Binding Path=DataContext.ColorCount,
RelativeSource={RelativeSource AncestorType=local:MultiChart, Mode=FindAncestor},
Converter={StaticResource MyColorConverter}}"/>
</Style>
在LocalColorConverter.cs
:
class LocalColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int count = (int)value;
//SolidColorBrush returnBrush = new SolidColorBrush();
SolidColorBrush color = new SolidColorBrush();
switch (count % 5)
{
case 0:
color.Color = Colors.Blue;
break;
case 1:
color.Color = Colors.Green;
break;
case 2:
color.Color = Colors.Red;
break;
case 3:
color.Color = Colors.Purple;
break;
case 4:
color.Color = Colors.Yellow;
break;
}
return color;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我知道這是不是在實踐中非常好。它依賴於來自視圖模型的ColorCount值,這是與視圖相關的信息。糟糕的MVVM,但我只是試圖讓它適應模式之前工作。
此外,它並不真實,因爲ColorCount
從不改變。它在視圖模型中最初設置爲0。如果我繼續沿着這條路走下去,我想增加ColorCount的值,以便每次使用Converter時顏色都會改變。
我試着在轉換器返回之前只做((int)value)++
,但那沒有奏效。我不認爲它會,但它讓你知道我在找什麼。
否則,我認爲我的最佳解決方案是在後面的代碼中執行此操作。但我不知道在哪裏/如何去做。當UserControl
達到新的LineSeries
時,它將不得不改變顏色。背後的當前代碼已實現了一個LineSeries_Loaded
事件處理函數,但顏色未在行中設置,它爲行中的每個點設置。所以我需要在每一行增加我的顏色計數器,然後使用每個點的計數來確定它的顏色。
我試過這個,但我似乎無法找到背景屬性這種方式。請注意,圖表是MultiChart
對象的名稱。
private void LineSeries_Loaded(object sender, RoutedEventArgs e)
{
foreach(LineSeries line in chart.Series.Cast<LineSeries>())
{
foreach(LineDataPoint point in line)
{
}
}
}
但我得到的錯誤,該行沒有公共的GetEnumerator。
有什麼建議嗎?
這是wpf工具包的權利?它不支持將Palette的依賴項屬性設置爲StaticResource並指定顏色類似[this](http://stackoverflow.com/questions/3703301/changing-default-colors-of-wpftoolkit-chart -控制)?過了一段時間,因爲我已經與它d so,所以我可能是錯的。 –
我已經嘗試了一些選項與調色板。問題是我需要爲'MultiChart'有一個'Palette',它沒有那個屬性。這是一個圖表集合。而且我無法想象創建這個屬性會很容易,而且我有一段糟糕的時間來製作依賴屬性。我不知道從哪開始。 – MichaelN