Я использую WPF КАРТОГРАФИРОВАНИЯ ToolKit через пространство имен:Как привязать к другому элементу управления собственности в WPF
xmlns:ChartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:VisualizationToolkit="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
У меня есть элемент управления диаграммой, в которой я генерировать случайный цвет для каждого времени предпринят Lineseries
участок , Я удалить маркеры точек данных и раскрасить, используя следующий стиль
<Style x:Key="LineDataPointStyle"
TargetType="ChartingToolkit:LineDataPoint">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Width" Value="NaN"/>
<Setter Property="Height" Value="NaN"/>
<Setter Property="Background"
Value="{Binding RelativeSource={RelativeSource Self},
Converter={StaticResource ColorBrushConverter}}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ChartingToolkit:LineDataPoint">
<Grid x:Name="Root" Opacity="0"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
В LineSeries
определяется с помощью
<ChartingToolkit:LineSeries Title="{Binding DisplayName}"
AnimationSequence="FirstToLast"
SnapsToDevicePixels="True"
DataPointStyle="{StaticResource LineDataPointStyle}"
ItemsSource="{Binding Data}"
IndependentValueBinding="{Binding X}"
DependentValueBinding="{Binding Y}"/>
Теперь, это работает отлично, но маркеры легенды отображать различные цвета в случайном, который я генерировать для LineSeries
. Я хочу, чтобы один и тот же цвет отображался для элемента легенды для LineSeries
и самого Lineseries
. Итак, я стиль пункта легенды, как показано ниже
<Style x:Key="TestSuiteLegendItemStyle"
TargetType="{x:Type ChartingToolkit:LegendItem}">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ChartingToolkit:LegendItem}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<StackPanel Orientation="Horizontal">
<Rectangle Width="8"
Height="8"
Fill="{Binding Background}"
Stroke="{Binding BorderBrush}"
StrokeThickness="1" Margin="0,0,3,0" />
<VisualizationToolkit:Title Content="{TemplateBinding Content}" />
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Мой вопрос как я могу «привязать» Rectangle.Fill
в TestSuiteLegendItemStyle
стиле, так что это тот же цвет, что и LineSeries
в установленном LineDataPointStyle
определен выше ? *
Спасибо за ваше время.
Редактировать. Я попытался установить в DependencyProperty
, который держит Background
цвет моего участка, как предложено ниже с помощью
<Style x:Key="LineDataPointStyle"
TargetType="ChartingToolkit:LineDataPoint">
...
<Setter Property="Background"
Value="{Binding RelativeSource={RelativeSource Self},
Converter={StaticResource ColorBrushConverter}}"/>
...
</Style>
Где я ammended преобразователь (как отмечено), так что я могу хранить случайно сгенерированный цвет фона, а затем использовать это в моей легенде
public class ColorToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
Brush b = new SolidColorBrush(Utils.GenerateRandomColor());
MultiChartExtensions.BackgroundBrushProperty = b; <= how to set the dependency property?
return b;
}
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
где Dependency Property (DP) определяется как
public static readonly DependencyProperty BackgroundBrushProperty;
public static void SetBackgroundBrush(DependencyObject DepObject, Brush value)
{
DepObject.SetValue(BackgroundBrushProperty, value);
}
public static Brush GetBackgroundBrush(DependencyObject DepObject)
{
return (Brush)DepObject.GetValue(BackgroundBrushProperty);
}
Я бы тогда искать, чтобы установить легенду фона с помощью этого DP через
<Style x:Key="TestSuiteLegendItemStyle"
TargetType="{x:Type ChartingToolkit:LegendItem}">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ChartingToolkit:LegendItem}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<StackPanel Orientation="Horizontal">
<Rectangle Width="8"
Height="8"
Fill="{Binding MultiChart:MultiChartExtensions.BackgroundBrushProperty}"
Stroke="{Binding BorderBrush}"
StrokeThickness="1" Margin="0,0,3,0" />
<VisualizationToolkit:Title Content="{TemplateBinding Content}" />
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Любая помощь с этим была бы оценена ...
Еще раз спасибо за другой ответ, я многому учусь из ваших ответов. Я видел, как вы упоминали использование «Tag» раньше, но здесь мне не ясно, как вы собираетесь использовать его для включения «Background»? Это персональный проект, поэтому я попытаюсь выполнить ваши предложения после работы сегодня вечером ... Еще раз спасибо. – MoonKnight
Примечание. Я задал более общий вопрос: http://stackoverflow.com/questions/21293363/change-the-color-displayed-in-wpf-charting-toolkit-legend, который имеет активную награду. Ответ на этот вопрос будет сочетанием того, что я сделал в моем новом вопросе выше, и вашего ответа ... Я с радостью награду вас щедростью позже, если ваши предложения будут работать. – MoonKnight
@Killercam: Пожалуйста, см. Мое редактирование. Вместо этого элементы управления «ChartingToolkit» взяли за основу «Button», потому что легче продемонстрировать идею этих стилей, и я лично не работал с «ChartingToolkit». Если есть проблемы с вашей реализацией «ChartingToolkit» или возникнут дополнительные вопросы, спросите пожалуйста. –