如何在运行时动态更改App.xaml资源

时间:2019-02-27 15:00:58

标签: xaml uwp

我的应用程序中有些区域会由我从Web应用程序中获得的颜色代码着色。我对如何实现这一目标进行了很多思考,但我不知道如何解决该问题。

我的第一个想法是编写一个ValueConverter,它只提供这些颜色,以便我可以在它工作时进行调试。

但是现在我试图在某些样式中使用它。我遇到了无法在ValueConverter中使用App.xaml的问题。

所以我要归档的是,当我导航到诸如mainpage.xaml之类的内容时,没有显示特定于用户的内容,我想使用我公司的颜色,但是当用户导航至该内容为用户的页面时具体我要显示当前用户的公司颜色。

因此,我搜索了 stackoverflow 如何做到这一点,并发现了这篇帖子here。但是我总是在输出窗口中收到绑定失败消息。

<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 :(得分:0)

我查看了您的绑定数据错误,并在下面查看:

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的问题,而是TargetNullValueFallbackValue的问题。

您应为以下两个属性创建有效值:

<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>

通过将您的代码更改为我在绑定数据错误上方发布的代码消失了。


更新

最好解决原始问题,而不是仅解决绑定错误。您最初的问题是由于从Web应用程序获得的颜色而更改按钮样式的背景。

所以我在下面编写了新代码来实现您的目标,并且其中不包含任何转换器。

<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));
    }
}