2

どこでも検索しましたが、これに対する説明や解決策が見つからないので、誰かが私の問題に光を当ててくれることを願っています。

問題を説明するために、TextBlock から継承する Label というクラスを作成しました。デフォルトのフォアグラウンド ブラシ、フォント ウェイト、フォント サイズ、およびフォント ファミリーをオーバーライドしたいと考えています。すべてのオーバーライドはフォアグラウンドとは別に機能します (背景を問題なくオーバーライドできるため、フォアグラウンド プロパティに固有のものです)。

新しい WPF アプリケーションを作成し、次の単純なクラスを作成します。

namespace WpfApplication
{
    public class Label : TextBlock
    {
        static Label()
        {
            ForegroundProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(Brushes.Red));
            FontWeightProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(FontWeights.Bold));
            FontSizeProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(50.0));
            FontFamilyProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(new FontFamily("Calibri")));
        }
    }
}

MainWindow.xaml で、この新しい Label クラスのインスタンスを作成します。

<Grid>
    <local:Label Text="TEST" />
</Grid>

ラベルが新しいフォアグラウンドのデフォルトを採用していないことがわかりますが、SNOOP を見ると、まだその値を継承しています。

私が知る限り、どの依存関係プロパティもオーバーライドできるので、どんな助けも大歓迎です!

4

2 に答える 2

5
ForegroundProperty.OverrideMetadata(typeof(LcdTextBlock), new FrameworkPropertyMetadata(new SolidColorBrush(Colors.Lime)) { Inherits = false });

これは私にとってはうまくいきます。

于 2014-05-06T19:02:55.417 に答える
2

1 つの回避策は次のとおりです。

public class Label : TextBlock
    {
        static Label()
        {
            ForegroundProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(Brushes.Red, OnForegroundChanged));
            FontWeightProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(FontWeights.Bold));
            FontSizeProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(50.0));
            FontFamilyProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(new FontFamily("Calibri")));
        }

        private static void OnForegroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {

        MethodInfo mi = typeof(DependencyPropertyChangedEventArgs).GetMethod("get_OperationType",
                                                                              BindingFlags.NonPublic |
                                                                              BindingFlags.Instance);
        var v = mi.Invoke(e, null);

        if ((e.NewValue != Brushes.Red) && (v.ToString() == "Inherit"))
        {
            ((Label)d).Foreground = Brushes.Red;
        }
        else
        {
            ((Label)d).Foreground = (Brush)e.NewValue;
        }
    }
}

デザイン ビューの VisualStudio 2012 では、コードのプレビューにテキストが赤色で表示されます。実行時に何かが変更されます。しかし、現時点では、誰が、なぜ、とは言えません... デフォルトの継承された値が蔓延しています!

編集:ここにいくつかの良い情報があります。

于 2013-01-03T15:50:45.263 に答える