2016-11-15 5 views
2

давайте предположим, что у нас есть контроль, который имеет свой собственный набор стилей в разделе Ресурсы:Как изменить стиль элемента управления во время своей жизни

<Page.Resources> 
    <Style TargetType="Button" x:Key="ButtonStyle"> 
     <Setter Property="Background" Value="Red"/> 
     <Setter Property="FontSize" Value="20"/> 
    </Style> 
</Page.Resources> 

<Grid> 
    <Button Content="Test label" Style="{StaticResource ButtonStyle}"/> 
</Grid> 

Проблема: Для примера - я хочу, чтобы пользователю decice которого цвета фона должны на фоне кнопки - во время, когда элемент управления уже отображается над макетом.

Редактирование стиля внутри xaml не будет работать, тогда он должен быть повторно применен для управления - это StaticResource, поэтому он никогда этого не сделает. Есть ли способ заставить элемент управления повторно применить стиль?

Установка стиля в коде не будет работать, если только не существует способа только получить существующий стиль и изменить только одно свойство, оставив неповрежденным цели вручную, копируя/устанавливая их вручную. Не думайте, что повторное применение стиля таким образом, если у меня есть более одного элемента управления, хорошая идея.

Идеальный способ: 1) получить стиль из ResourceDictionary 2) изменить одно свойство в этом стиле 3) вызвать метод Control.RefreshStyle(), который заставит элемент управления искать стиль и применить его снова.

Любые идеи, как это сделать чистым способом? Стили хранятся в ResourceDictionaries, и они должны оставаться такими. Как я могу изменить/изменить их, а затем заставить элементы управления применить новый стиль?

Обратите внимание, что создание var style = new Style(); затем вручную добавление style.AddValue (...); и настройка control.Style = style; это не решение для меня. У меня слишком много стилей и слишком много элементов управления.

редактировать: Обратите внимание 2: Я использую UWP, а не WPF, поэтому все решения, основанные на DynamicResource не будет работать для меня

+0

http://svetoslavsavov.blogspot.hu/2009/07/switching-wpf-interface-themes-at.html – Blackstar

+0

Я не DynamicResource в UWP – RTDev

ответ

0

Основная идея о том, 1 ключ для многих целевых стилей (скажем, для пример x:key="ButtonStyleKey" для управления кнопками), и у вас должен быть один или несколько ресурсных словарей (xaml-файлов), определяющих этот ключ разными способами. И когда вам нужно изменить стиль, вы должны перезагрузить ваш словарь ресурсов в вашей (страницы, окна виджета .. независимо от UIElement вы используете)

Update

Вы можете сделать следующее:

var resDictionary = new ResourceDictionary(); 
resDictionary.Source = new Uri("CustomResourceDictionary.xaml",UriKind.Relative); 
Application.Current.Resources.MergedDictionaries.Add(resDictionary); 

Я должен также упомянуть, что только изменения ThemeResource (DynamicResource в WPF) будут принимать изменения. StaticResources no.

<Button Content="Test label" Style="{ThemeResource ButtonStyle}"/> 
+0

Что вы имеете в виду, перезагружая словарь ресурсов? У меня есть 2 ресурсных словаря, каждый из которых имеет один и тот же ключ, и когда я использую этот ключ для установки стиля для управления, он использует один из последнего словаря. – RTDev

+0

@RTDev не могли бы вы посмотреть мое обновление. Это может быть полезно :) –

+0

Надеюсь, что вы имеете в виду что угодно, кроме этого;) Он не обновит мой макет - не имеет DynamicResource в UWP :( – RTDev

Смежные вопросы