WPF: Изменение Ресурсов (цвета) от App.xaml во время времени выполнения

Один из вариантов - изменить структуру данных, чтобы она была более сортируемой. Например:

const data = {
 names: ['John','Bob','Ram','Shyam'],
 marks: ['64','22','80','32']
}

const people = data.names.map((name, i) => ({
  name,
  mark: data.marks[i]
}))

const sorted = people.sort((a, b) => a.name.localeCompare(b.name))

console.log(sorted)

Второй вариант - сохранить массив индексов, который вы сортируете на основе данных. Это не меняет ваши исходные структуры, но я не думаю, что это хороший вариант, потому что было бы сложно синхронизировать массивы имен и меток. Например:

const data = {
 names: ['John','Bob','Ram','Shyam'],
 marks: ['64','22','80','32']
}

const index = Array.from(Array(data.names.length).keys())

index.sort((a, b) => data.names[a].localeCompare(data.names[b]))

console.log(index)

// use the names & marks
index.forEach(i => {
  console.log(`${data.names[i]} - ${data.marks[i]}`)
})

10
задан Community 23 May 2017 в 01:54
поделиться

4 ответа

Похоже, вы пытаетесь создать какую-то обложку?

Я бы порекомендовал определить ресурсы в Словаре ресурсов, содержащемся в отдельном файле. Затем в коде (App.cs для загрузки по умолчанию, а затем в другом месте для изменения) вы можете загрузить ресурсы следующим образом:

//using System.Windows
ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("MyResourceDictionary.xaml", UriKind.Relative);

Application.Current.Resources.MergedDictionaries.Add(dict);

Вы также можете определить словарь ресурсов по умолчанию в App.xaml и выгрузить его в коде просто отлично.

Используйте объект MergedDictionaries, чтобы изменить словарь, который вы используете во время выполнения. Работает как талисман за быстрое изменение всего интерфейса.

15
ответ дан 28 October 2019 в 05:21
поделиться

Изменение ресурсов приложения во время выполнения выглядит следующим образом:

Application.Current.Resources("MainBackgroundBrush") = Brsh

Насчет исключения InvalidOperationException, я думаю, программист WallStreet прав. Возможно, вам не следует пытаться изменить существующую кисть, а вместо этого создать новую кисть в коде со всеми необходимыми вам градиентными поверхностями, а затем назначить эту новую кисть в ресурсах приложения.

Еще один подход к изменению цвета некоторых GradientStops - это определить эти цвета как ссылки DynamicResource на Solid Wide ColorColorBrushes приложения, например:

<LinearGradientBrush x:Key="MainBrush" StartPoint="0, 0.5" EndPoint="1, 0.5" >
<GradientBrush.GradientStops>
    <GradientStop Color="{DynamicResource FirstColor}" Offset="0" />
    <GradientStop Color="{DynamicResource SecondColor}" Offset="1" />
</GradientBrush.GradientStops>

, а затем использовать

Application.Current.Resources["FirstColor"] = NewFirstColorBrsh
Application.Current.Resources["SecondColor"] = NewSecondColorBrsh

HTH

11
ответ дан 28 October 2019 в 05:21
поделиться

Вы получаете исключение, потому что вы пытаетесь изменить замороженный объект. Все ресурсы уровня приложения автоматически замораживаются, если они замораживаются, а LinearGradientBrush - замораживается. Если вы добавите его на более низкий уровень, такой как уровень окна, он будет работать.

1
ответ дан 28 October 2019 в 05:21
поделиться

Используйте метод Clone() для создания глубокой копии кисти (или любого другого замораживаемого объекта, например Storyboard) и затем используйте его:

LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush;
myBrush = myBrush.Clone();
myBrush.GradientStops[0].Color = Colors.Red;

@WallstreetProgrammer прав - все ресурсы уровня приложения заморожены по умолчанию.

Вот почему вам нужно сначала клонировать объект.

2
ответ дан 28 October 2019 в 05:21
поделиться
Другие вопросы по тегам:

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