0

まず、次のように、アプリケーション リソースのリソースとしてスタイルがあります。

<Style x:Key="ContentTextBlock" TargetType="FrameworkElement">
   <Setter Property="TextBlock.HorizontalAlignment" Value="Center"/>
   <Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
   <Setter Property="TextBlock.FontFamily" Value="Verdana"/>
   <Setter Property="TextBlock.FontSize" Value="12"/>
   <Setter Property="TextBlock.FontWeight" Value="Normal"/>
   <Setter Property="TextBlock.Foreground" Value="Orange"/>
</Style>

ヘッダーとコンテンツを含むカスタム コントロールを作成しました。カスタム コントロール テンプレートのコンテンツ セクションは次のようになります。

<ContentPresenter Content="{TemplateBinding Content}"
                  Style="{DynamicResource ContentTextBlock}">
</ContentPresenter>

私の問題は、作成したコントロールを次のように使用する場合です。

<local:CutPage.Content>
            <TextBlock>Header</TextBlock>
</local:CutPage.Content>

Fontsize、FontWeight、および FontFamily は、TextBlock の明示的なスタイルまたはデフォルトのスタイルによってオーバーライドされます (そのように思われますが、よくわかりません)。依存関係の値の順序と優先順位に関する記事を読みましたが、テンプレート スタイルをオーバーライドしているものをどのように推測できますか? カスタム コントロールに入るすべてのヘッダー要素がこれらの値を使用するようにします。どうすればいいですか?

PS 興味深いのは、一部のスタイル セッターは動作することです (テキストを垂直および水平方向に中央揃えするなど) が、他のスタイル セッターは機能しません。

4

2 に答える 2

1

基本スタイルを別のファイルに入れて、テキストブロックで継承して使用するよりも、次のようにできますか?

<TextBlock>
<Style TargetType="..." BasedOn="{StaticResource MyGeneralStyle}">                       <Setter Property="Foreground" Value="..."/>
</Style>
</TextBlock>
于 2012-10-16T09:53:04.890 に答える
1

CustomControl を維持したい場合は、テキストブロックのプロパティに一致する Dependency Properties を定義し、ControlTemplate でバインディングを行う必要があります。

私がすることは、TextBox から派生した CustomControl を作成し、それを ControlTemplate に変更して、必要なものを追加し、必要なものすべてを ControlTemplate にバインドすることです。

または、必要なことを正確に行うと思われるHeaderedContentControlを使用することもできます。

<HeaderedContentControl FontFamily="Arial" Foreground="Red" Header="Hello World">
    <Rectangle Width="10" Height="10" Fill="Blue" />
</HeaderedContentControl>
于 2012-10-16T09:51:12.973 に答える