以编程方式将 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"];
}
希望这对您有所帮助!
我正在使用 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"];
}
希望这对您有所帮助!