Как динамически изменять ресурсы App.xaml во время выполнения - PullRequest
0 голосов
/ 27 февраля 2019

В моем приложении есть области, которые окрашиваются в цветовые коды, которые я получаю из веб-приложения.Я много думал о том, как этого добиться, и я не знаю, как решить эту проблему.

Моей первой мыслью было написать ValueConverter, который просто предоставляет эти цвета, чтобы я мог отлаживать всякий раз, когда он работал.

Но теперь, когда я пытаюсь использовать его на некоторых styles Я столкнулся с проблемой, которую я не могу использовать ValueConverter в App.xaml.

Так что я пытаюсь заархивировать то, что при переходе к чему-то похожему на главную страницу.xaml, где не отображается контент, специфичный для пользователя, я хочу использовать цвета своей компании, но когда пользователь переходит на страницы, где контент зависит от пользователя, я хочу отобразить цвета компании текущего пользователя.

Поэтому я искална stackoverflow как это сделать, и я сталкиваюсь с этим постом здесь .Но я всегда получаю сообщение об ошибке привязки в окне вывода.

<Setter Property="Background">
    <Setter.Value>
        <Binding Path="Background" RelativeSource="{RelativeSource Self}" TargetNullValue="a" FallbackValue="a">
            <Binding.Converter>
                <provider:DarkBackgroundProvider/>
            </Binding.Converter>
        </Binding>
    </Setter.Value>
</Setter>

Есть идеи или, возможно, другой подход к этому?

Я также читаю на некоторых сайтах, которые я могу заменить значениями с App.xaml, но это не сработало для меня, потому что я получал исключения всякий раз, когда хотел установитьзначение App.Resources[] = Color

1 Ответ

0 голосов
/ 28 февраля 2019

Я рассмотрел вашу ошибку данных привязки и вижу ее ниже:

Exception thrown: 'System.FormatException' in PresentationCore.dll
System.Windows.Data Error: 12 : TargetNullValue 'a' (type 'String') cannot be converted for use in 'Background' (type 'Brush'). BindingExpression:Path=Background; DataItem=null; target element is 'Button' (Name=''); target property is 'Background' (type 'Brush') FormatException:'System.FormatException: Token is not valid.

Ошибка данных привязки - это не проблема DarkBackgroundProvider, а проблема TargetNullValue и FallbackValue.

Вы должны создать действительное значение для двух свойств, как показано ниже:

<Setter Property="Background">
    <Setter.Value>
        <Binding Path="Background" RelativeSource="{RelativeSource Self}">
            <Binding.TargetNullValue>
                <SolidColorBrush Color="White" />
            </Binding.TargetNullValue>
            <Binding.FallbackValue>
                <SolidColorBrush Color="White" />
            </Binding.FallbackValue>
            <Binding.Converter>
                <local:DarkBackgroundProvider />
            </Binding.Converter>
        </Binding>
    </Setter.Value>
</Setter>

При изменении вашего кода на тот, который я разместил выше, ошибка данных привязки исчезла.


Обновление

Лучше решить исходную проблему, а не просто устранить ошибку привязки.Ваша первоначальная проблема заключается в том, чтобы изменить стиль фона кнопки из-за цвета, который вы получаете из своего веб-приложения.

Итак, я написал новый код ниже для достижения вашей цели, и он не содержит преобразователей.

<Application x:Class="Walterlv.Styles.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Walterlv.Styles"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <SolidColorBrush x:Key="Brush.MainButton.Background" Color="White" />
        <Style TargetType="Button">
            <Setter Property="Background" Value="{DynamicResource Brush.MainButton.Background}" />
        </Style>
    </Application.Resources>
</Application>

Это код приложения App.xaml.Если вы можете получить экземпляр класса App, вы можете изменить цвет в соответствии с только что вычисленным значением.

public partial class App : Application
{
    protected override async void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        await Task.Delay(2000);

        Resources["Brush.MainButton.Background"] = new SolidColorBrush(Color.FromRgb(0x00, 0x7a, 0xcc));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...