@WayMax

Как изменить цвет WPF-элементов (цвет взять из файла)?

Я бы хотел изменять цвета WPF-элементов без перекомпиляции приложения.
Цвет должен хранится в файле который можно изменить вручную.
Найденные в интернете варианты не работают.

варианты
<Window x:Class="TEST.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TEST"
        xmlns:p="clr-namespace:TEST.Properties"
        Title="MainWindow" Width="800" Height="600">
    <Grid>
        <Label x:Name="label" Content="Test" HorizontalAlignment="Left" Margin="104,101,0,0" VerticalAlignment="Top" Background="{Binding Source={x:Static p:Settings.Default}, Path=SomethingsColor}" Height="107" Width="218"/>
    </Grid>
</Window>


Вариант 1:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
    <add key = "SomethingsColor" value = "Black" />
  </appSettings>
</configuration>

Label просто не отображается на форме.

Вариант 2:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
<applicationSettings>
    <TEST.Properties.Settings>
        <setting name="SomethingsColor" serializeAs="String">
            <value>#FF008000</value>
        </setting>
    </TEST.Properties.Settings>
</applicationSettings>
</configuration>

Падает с ошибкой: https://docs.microsoft.com/en-us/previous-versions...


Я хотел изменять цвет на тот который хранится где-то в файле. У проекта уже есть файл App.config поэтому не хотел создавать другие файлы. Понимаю что можно просто открыть этот файл в коде, распарсить его, взять цвета, заполнить поля с OnPropertyChanged и прописать Binding к этим полям. Но ведь это велосипед. Неужели нет готового решения?
  • Вопрос задан
  • 2415 просмотров
Пригласить эксперта
Ответы на вопрос 2
Exomode
@Exomode
Архитектор ПО
Вы можете вынести ваши xaml-файлы с разметкой стилей или шаблонов в локальную директорию программы, после чего грузить их прямо в рантайме без перекомпиляции, например, как здесь
Ответ написан
FoggyFinder
@FoggyFinder
Используйте динамические ресурсы. Пример:

1. Добавляйте в ресурсы приложения (файл App.xaml):

<Application.Resources>
    <SolidColorBrush x:Key="solidGrayBrush" Color="Gray" />


Будьте внимательны и не путайте ресурсы объектов WPF и ресурсы сборки.

2. Ссылаетесь в элементе как динамический ресурс:

<TextBlock
    Background="{DynamicResource solidGrayBrush}"
    Text="Test" />


В качестве примера будем менять кисть на случайную по нажатию на кнопку:

Brush[] brushes =
        typeof(Brushes)
        .GetProperties()
        .Select(p => (Brush)p.GetValue(null))
        .ToArray();
Random r = new Random();


и обработчик нажатия на кнопку:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var b = brushes[r.Next(brushes.Length)];
    Application.Current.Resources["solidGrayBrush"] = b;
}


5cab235c13a81873403570.gif
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы