BasedOn="{StaticResource {x:Type TextBox}}" в коде позади стиля

Как вы можете установить следующее в коде позади?

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">

Я использую тему, объединенную в App.xaml. Он отлично работает для всех элементов управления, но когда я определяю стиль для чего-то, например TextBoxстиль темы не будет поднят, если я не использую BasedOn как выше, вместо этого он получает значение по умолчанию TextBox Стиль.

Сейчас я создаю DataGridTextColumn в коде позади, и я не могу получить BasedOn часть работать на EditingElementStyle

Style editingStyle = new Style(typeof(TextBox));
editingStyle.BasedOn = ...?;

Какие-либо предложения? Кроме того, есть ли способ получить стиль темы вместо стиля по умолчанию, примененного без использования BasedOn?

Спасибо

4 ответа

Решение

Попробуй это:

editingStyle.BasedOn = (Style) FindResource(typeof (TextBox))

И я не знаю, как вы можете применить стиль Theme без указания BasedOn, Если есть такой способ, я бы тоже хотел это знать...

Это должно работать:

Style baseStyle = new Style(typeof(TextBox));
Style editingStyle = new Style(typeof(TextBox));
editingStyle.BasedOn = baseStyle;

Вы также можете сделать это в конструкторе:

Style editingStyle = new Style(typeof(TextBox), baseStyle);

Мне нравится ответ Павла Глазкова, но он не компилируется.

FindResource является (не статичным) членом FrameworkElement. Требуется определить контекст поискового запроса.

Поэтому я рекомендую это:

style.BasedOn = (Style)frameworkElement.FindResource(typeof(TextBox));

Вот сообщение, которое появилось через несколько лет после этого вопроса и предоставляет функциональный способ ссылки на тему из XAML. Согласно /questions/35721770/dostup-k-resursu-cherez-codebehind-v-wpf/35721790#35721790

Сначала определите словарь ресурсов XAML с помощьюx:classидентификатор вместе сx:Keyвашего ресурса

ResourceDictionary x:Class="YourNameSpaceHere.DataGridCellTemplates"

      <Style x:Key="ValidationError_TextBox" TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationErrorTempate}" />
</Style>

Второе — создать.csфайл, который будет инициализировать класс ресурсов.

      using System.Windows;

namespace YourNameSpaceHere
{
    public partial class DataGridCellTemplates : ResourceDictionary
    {
        public DataGridCellTemplates()
        {
            InitializeComponent();
        }
    }
}

Наконец - ссылка из вашего кода

      using YourNameSpaceHere;
....
var res = new DataGridCellTemplates();
Style test = res["ValidationError_TextBox"] as Style;
Другие вопросы по тегам