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;