Итак, после некоторого исследования ColorPage.tsx
из репозитория Office UI Fabric я обнаружил недостающие фрагменты, чтобы достичь этого самостоятельно. Приведенный ниже код просто очень прост в использовании этого механизма, который удовлетворяет моим потребностям. На данный момент я не хочу, чтобы пользователь изменял основной фон или цвета переднего плана, отсюда и упрощения. Используйте и расширяйте его на свой страх и риск, но не стесняйтесь спрашивать меня, если что-то не понятно. Но я думаю, довольно ясно, что здесь происходит.
import { loadTheme } from '@uifabric/styling';
import {
IThemeRules,
ThemeGenerator,
themeRulesStandardCreator,
} from 'office-ui-fabric-react/lib/ThemeGenerator';
import { getColorFromString } from 'office-ui-fabric-react/lib/utilities/color/getColorFromString';
import { IColor } from 'office-ui-fabric-react/lib/utilities/color/interfaces';
export default class ThemeProvider {
private themeRules: IThemeRules;
constructor() {
const themeRules = themeRulesStandardCreator();
ThemeGenerator.insureSlots(this.themeRules, false);
ThemeGenerator.setSlot(themeRules.backgroundColor, getColorFromString('#ffffff'), false, true, true);
ThemeGenerator.setSlot(themeRules.foregroundColor, getColorFromString('#000000'), false, true, true);
this.themeRules = themeRules;
}
public loadThemeForColor(hexColor: string): void {
const newColor: IColor = getColorFromString(hexColor);
const themeRules = this.themeRules;
ThemeGenerator.setSlot(themeRules.primaryColor, newColor.str, false, true, true);
this.themeRules = themeRules;
const theme = ThemeGenerator.getThemeAsJson(this.themeRules);
loadTheme({
...{ palette: theme },
isInverted: false,
});
}
}
Для получения более подробной информации посмотрите на ColorPage.tsx
в официальном репо, поскольку я не стремился понять все, что там происходит.