1

Application.xaml に追加されたスタイル xaml リソース ディクショナリがあります。そのスタイル ファイルでは、すべてのテキスト ブロックの前景色を白にするように指定しています。問題は、これにより、同じアプリケーションにあるユーザーコントロールでコンボボックス項目の前景が白に変わることです。すべてまたはこの 1 つのコンボボックスだけでアイテムの前景を黒くしたい。私はそれを実現するのに大きな問題を抱えています。

これは、テキストブロックの私のグローバル スタイルです。

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

また: ユーザー コントロールは、コード ビハインドでコンボ ボックスを動的に追加します。

これはできますか?どのように?

Ray Burns のコメントに従って変更を加えました。これは私の 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>

しかし、それを機能させることはできません..まだ白い前景...

4

1 に答える 1

1

この質問の見方は次のとおりです: ComboBoxes で他の UI とは異なる 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;
    }
  });
}

これが機能する方法は、FrameworkElement (ComboBox など) に添付された Style1 プロパティを設定するたびに、デフォルト キーの下のリソースにスタイルを追加することです。したがって、上記の Style が ComboBox に適用されるたびに、内部の TextBox スタイルが ComboBox のリソースに追加され、TextBox がこのスタイルを取得します。

ここから、探しているものを簡単に実現できます。ComboBox スタイルをカスタム TextBox スタイルと一緒に App.xaml に配置するだけで完了です。

于 2010-03-03T17:10:10.113 に答える