Один из вариантов - изменить структуру данных, чтобы она была более сортируемой. Например:
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]}`)
})
Похоже, вы пытаетесь создать какую-то обложку?
Я бы порекомендовал определить ресурсы в Словаре ресурсов, содержащемся в отдельном файле. Затем в коде (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, чтобы изменить словарь, который вы используете во время выполнения. Работает как талисман за быстрое изменение всего интерфейса.
Изменение ресурсов приложения во время выполнения выглядит следующим образом:
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
Вы получаете исключение, потому что вы пытаетесь изменить замороженный объект. Все ресурсы уровня приложения автоматически замораживаются, если они замораживаются, а LinearGradientBrush - замораживается. Если вы добавите его на более низкий уровень, такой как уровень окна, он будет работать.
Используйте метод Clone()
для создания глубокой копии кисти (или любого другого замораживаемого объекта, например Storyboard
) и затем используйте его:
LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush;
myBrush = myBrush.Clone();
myBrush.GradientStops[0].Color = Colors.Red;
@WallstreetProgrammer прав - все ресурсы уровня приложения заморожены по умолчанию.
Вот почему вам нужно сначала клонировать объект.