以编程方式将 Oxyplot 绑定到 MahApps AccentColorBrush

Bind Oxyplot to MahApps AccentColorBrush programmatically

我正在使用 MahApps 并试图让它的强调色自动应用于 OxyPlot 图表。我正在使用 Caliburn 并在我的视图模型中以编程方式设置我的 LineSeries:

_bubbleSeries = new LineSeries
{
    StrokeThickness = 2,
    Color = {Binding AccentColorBrush} // <-- This line here would be nice
    CanTrackerInterpolatePoints = false,
    Title = "Bubbles",
    Smooth = true,
};

在 XAML 中绑定到 AccentColorBrush 很容易,但 OxyPlot 不允许我在 XAML 中设置 LineSeries 因此任何关于如何在我的 ViewModel 中以编程方式执行此操作的建议都会不胜感激。

假设您在 App.xaml 中有一个 MahApps 主题,例如 Cobalt Theme

<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Cobalt.xaml" />

您可以使用 ThemeManager class

访问某些颜色
 var color = MahApps.Metro.ThemeManager.GetAccent("Cobalt").Resources["AccentColor"];

您可以通过隐藏代码设置AccentColor

_bubbleSeries.SetResourceReference(ColorProperty, "AccentColor");

好处是,这是 DynamicResource,所以如果您改变口音或主题,它就会改变。

编辑

在我了解到 LineSeries 不是 FrameworkElement 之后,我可以提供另一种可能的解决方案。

ThemeManager 有一个事件可以对主题更改作出反应。

ThemeManager.IsThemeChanged += ThemeManager_IsThemeChanged;

void ThemeManager_IsThemeChanged(object sender, OnThemeChangedEventArgs e)
{
    // handle theme change
}

使用这些事件参数。

public static event EventHandler<OnThemeChangedEventArgs> IsThemeChanged;

public class OnThemeChangedEventArgs : EventArgs
{
    public AppTheme AppTheme { get; set; }

    public Accent Accent { get; set; }
}

所以你可以这样设置颜色

// this = maybe your window
var accentColor = ThemeManager.GetResourceFromAppStyle(this, "AccentColor")
// or
var accentColor = ThemeManager.GetResourceFromAppStyle(Application.Current.MainWindow, "AccentColor")

// initial
_bubbleSeries = new LineSeries
{
    StrokeThickness = 2,
    Color = accentColor,
    CanTrackerInterpolatePoints = false,
    Title = "Bubbles",
    Smooth = true,
};

现在主题更改后

void ThemeManager_IsThemeChanged(object sender, OnThemeChangedEventArgs e)
{
    // handle theme change
    _bubbleSeries.Color  = e.Accent.Resources["AccentColor"];
}

希望这对您有所帮助!