0

HeadTextwithと呼ばれる特定の WPF スタイルに問題がありTargetType = "TextBlock"ます。スタイルはForegroundFontSizeおよび を定義しEffectます。TextBlock が初めて表示されるときは、Foreground セッターのみが起動されず (テキストの色は黒のまま)、FontSize と Effect が通常どおり適用されます。親から TextBlock を削除して戻すと、前景も変更されます。

状況:

Presenter.dll アセンブリ

  • class Presenter: Window、私のユーザーコントロールをロードして表示します。
  • Generic.xaml- スタイルを含むリソース ディクショナリ。
  • Presenter.dllを直接参照しませんTestPresentable.dll

TestPresentable.dll アセンブリ

  • TestPresentable: UserControlには、スタイル付きの がありますTextBlock
  • TestPresentable.dllを直接参照しませんPresenter.dll

MainApp.exe

  • 以前の両方のアセンブリを参照し、
  • アセンブリMainWindowからインスタンス化します。Presenter.dll
  • アセンブリTestPresentableからインスタンス化します。TestPresentable
  • セットMainWindow.ContentHost.Content = testPresentable

関連コード:

プレゼンター.dll

// Themes/Generic.xaml
...
<Style TargetType="{x:Type TextBlock}" x:Key="HeadText">
    <Setter Property="Foreground" Value="#FFFFFFFF" />
    <Setter Property="Effect">
        <Setter.Value>
            <DropShadowEffect ShadowDepth="0" Color="#79000000" BlurRadius="3" Opacity="1" />
        </Setter.Value>
    </Setter>
    <Setter Property="FontSize" Value="24"/>
</Style>
...


// MainWindow.xaml
...
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Presenter.dll;component/Themes/Generic.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <ContentPresenter Name="ContentHost"/>
</Grid>
...

TestPresentable.dll

// TestPresentable.xaml
...
<TextBlock Text="{Binding SomeData}" Style="{DynamicResource HeadText}"/>
...
4

2 に答える 2

7

3.5 以降、WPF の TextBlock.Foreground に奇妙な点があるようです。次を参照してください。

EventSetters と ResourceDictionary のコード ビハインドを使用して回避策を考え出しました。きれいではありませんが、スタイルをメインアプリから独立させたい場合は、そうする必要があります。誰かに役立つかもしれないのでここに投稿します。誰かが正しい(またはより良い)回答を投稿した場合は、質問を開いたままにします。

回避策

ResorceDictionary XAML (例: Generic.xaml) で、次のように Class プロパティを追加します。

<!-- Generic.xaml -->
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Presenter.Themes.Generic">

次に、ResourceDictionary の Class プロパティで指定した部分クラスを含む分離コード cs ファイル (Generic.xaml.cs など) を追加します。

// Generic.xaml.cs
partial class Generic { }

ResourceDictionary の関連するスタイルで、Loaded イベントの EventSetter を追加します。

<!-- Generic.xaml -->
<Style TargetType="{x:Type TextBlock}" x:Key="HeadText">
    <EventSetter Event="Loaded" Handler="OnHeadTextLoaded"/>
    <Setter .../>
    <Setter .../>
    <Setter .../>
</Style>

Generic.xaml.cs で、Loaded イベントのハンドラーを追加し、目的の Foreground を設定します。

//Generic.xaml.cs
public void OnHeadTextLoaded(object sender, EventArgs args)
{
    var textBlock = sender as TextBlock;
    if (textBlock == null) return;
    textBlock.Foreground = new SolidColorBrush(Colors.White);
}
于 2011-07-04T09:43:50.437 に答える
1

ページが最初にロードされたときに前景色が引き出されないという同様の問題があります。私の場合FontFamily、 が配置されている xaml ファイルでプロパティをハードコーディングするTextBlockと、最初は前景色が正しく表示されることがわかりました。

ただし、FontFamilyプロパティをスタイルシートに配置するだけでは、TextBlock最初は黒になります。

例えば

// TestPresentable.xaml

...
Style="{DynamicResource HeadText}" **FontFamily="Arial"**... 
于 2012-05-17T08:57:27.150 に答える