2016-09-09 5 views
0

WPF GroupBoxと同様のカスタムコントロールを作成する必要があります。私はVS 2015で標準のWPFカスタムコントロールライブラリテンプレートから開始し、このように私のCustomGroupBoxコントロールを定義した:ContentControlはControlTemplateのコンテンツを表示しません

public class CustomGroupBox : ContentControl 
{ 
    static CustomGroupBox() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomGroupBox), new FrameworkPropertyMetadata(typeof(CustomGroupBox))); 
    } 
} 

そして、仕様に応じて、私のカスタムのGroupBoxを開発するラインの次最小限のセットを追加しました:デバッグに

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:CustomGroupBox"> 
    <Style TargetType="{x:Type local:CustomGroupBox}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:CustomGroupBox}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="Gray" BorderThickness="3" CornerRadius="3"> 
         <ContentControl /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

と発展、私は私のカスタムコントロールのテストフォームを作成:

<Window x:Class="CustomGroupBoxClient.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:CustomGroupBoxClient" 
     xmlns:ctrl="clr-namespace:CustomGroupBox;assembly=CustomGroupBox" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ctrl:CustomGroupBox Margin="5"> 
      <StackPanel Orientation="Vertical"> 
       <TextBlock>Text Block #1</TextBlock> 
       <TextBlock>Text Block #2</TextBlock> 
      </StackPanel> 
     </ctrl:CustomGroupBox> 
    </Grid> 
</Window> 
私はこれに関連する多くのマニュアルや記事を再読んだ

enter image description here

:私はこのフォームを起動したとき

はしかし、私は私のカスタムコントロールの境界線ではなく、コンテンツ(2のTextBlockの)を参照してください私のControlTemplateのContentControlが指定されたコンテンツを表示しない理由をまだ理解できません。私の問題を解決するには?

+2

'ContentControl'の代わりに' ContentPresenter'を使うか、明示的にバインドしてみてください: ''これは、あなたのカスタムコントロールのcontentプロパティが 'Content'と呼ばれていると仮定していますが、もしあなたが' ContentControl'から継承しているのであれば、これはあまり前提ではありません。 –

答えて

1

ContentPresenterの代わりに、あなたのテンプレートでContentControlを使用してみてください:

<ContentPresenter /> 

デフォルトでは、ContentPresenterは、それが見つけたものは何でもそのテンプレートの親とディスプレイのContentプロパティを検索します。あなたは...

<ContentPresenter ContentSource="FooBar" /> 

を、そのContentSource値を変化させることにより、探しプロパティの名前を変更することができます...しかし、あなたはContentControlから継承しているので、デフォルトでは、あなたが望むものと考えられます。

+1

くそー、それは愚かな質問だった。標準WPFコントロールのすべてのテンプレートは、ContentPresenterを使用します。おそらく、私はこれを見落としたので、私は試していた... – TecMan

関連する問題