WPF, как переопределить стиль приложения в текстовых блоках в определенных местах - PullRequest
1 голос
/ 03 марта 2010

У меня есть словарь ресурсов стиля xaml, который добавлен в Application.xaml. В этом файле стиля я указываю, что все текстовые блоки должны иметь передний план белого цвета. Проблема в том, что это изменит передний план элементов комбинированного списка на белый в пользовательском контроле, который я имею в том же приложении. Я хочу, чтобы у всех элементов был черный передний план или только этот комбобокс. У меня большие проблемы с этим.

Это мой глобальный стиль для текстовых блоков:

 <Style TargetType="{x:Type TextBlock}" >
        <Setter Property="Foreground">
            <Setter.Value>
                White
            </Setter.Value>
        </Setter>
        <Setter Property="Height">
            <Setter.Value>
                23
            </Setter.Value>
        </Setter>
  </Style>

Также: пользовательский контроль добавляет комбобокс динамически в код позади.

Можно ли это сделать? Как?

Я внес изменения в соответствии с комментарием Рэя Бернса. Это мой MyCustomStyler:

Public Class MyCustomStyler
    Inherits DependencyObject

    Public Shared Function GetStyle1(ByVal obj As DependencyObject) As Style
        Return obj.GetValue(Style1Property)
    End Function
    Public Shared Sub SetStyle1(ByVal obj As DependencyObject, ByVal value As Style)
        obj.SetValue(Style1Property, value)
    End Sub

    Public Shared instancePropertyChangedCallback As New PropertyChangedCallback(AddressOf PropertyChangedCallback_Handler)

    Public Shared ReadOnly Style1Property As DependencyProperty = _
                           DependencyProperty.RegisterAttached("Style1", _
                           GetType(Style), GetType(MyCustomStyler), _
                           New FrameworkPropertyMetadata(instancePropertyChangedCallback))

    Public Shared Sub PropertyChangedCallback_Handler(ByVal obj As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
        Dim element = CType(obj, FrameworkElement)
        Dim style = CType(e.NewValue, Style)
        element.Resources(style.TargetType) = style
    End Sub

End Class

Это мой раздел стиля:

<Style TargetType="ComboBox">
        <Setter Property="local:MyCustomStyler.Style1">
            <Setter.Value>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Foreground" Value="Black" />
                </Style>
            </Setter.Value>
        </Setter>
    </Style>

Не могу заставить его работать, хотя .. Все еще белый передний план ...

1 Ответ

1 голос
/ 03 марта 2010

Этот вопрос можно посмотреть следующим образом: как я могу заставить ComboBox использовать стиль TextBox, отличный от остальной части моего пользовательского интерфейса?

Ответ таков: создайте вложенное свойство, которое применяет другой стиль, затем используйте стиль ComboBox для применения присоединенного свойства.

Сначала стиль ComboBox, так что вы увидите, куда он идет:

<Style TargetType="ComboBox">
  <Setter Property="local:MyCustomStyler.Style1">
    <Setter.Value>
      <Style TargetType="TextBox">
        <Setter Property="Background" Value="Black" />
      </Style>
    </Setter.Value>
  </Setter>
</Style>

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

public class MyCustomStyler
{
  public static Style GetStyle1(DependencyObject obj) { return (Style)obj.GetValue(Style1Property); } 
  public static void SetStyle1(DependencyObject obj, Style value) { obj.SetValue(Style1Property, value); } 
  public static readonly DependencyProperty Style1Property = DependencyProperty.RegisterAttached("Style1", typeof(Style), typeof(MyCustomStyler), new PropertyMetadata 
  { 
    PropertyChangedCallback = (obj, e) => 
    {
      var element = obj as FrameworkElement;
      var style = e.NewValue as Style;
      element.Resources[style.TargetType] = style;
    }
  });
}

Способ, которым это работает, заключается в том, что каждый раз, когда вы устанавливаете присоединенное свойство Style1 для FrameworkElement (например, ComboBox), он добавляет стиль к ресурсам под ключом по умолчанию. Таким образом, всякий раз, когда вышеуказанный Стиль применяется к ComboBox, внутренний стиль TextBox будет добавлен к ресурсам ComboBox, в результате чего TextBox получит этот стиль.

Отсюда легко достичь того, что вы ищете: просто поместите стиль ComboBox в свой App.xaml вместе с вашим собственным стилем TextBox, и все готово.

...