2017-06-01 11 views
0

TextBoxを拡張する単純なカスタムコントロールを作成したいとします。WPFカスタムコントロールが空白

私はAdd -> New Item... -> Custom Controlで作成し、自動的に生成されたコードを少し変更します。 CustomControlの基底クラスをTextBoxに変更し、TemplateセッターをTheme/Generic.xamlというファイルで削除します。

ただし、MainWindowに追加して実行すると空白になります。

ファイルTheme/Generic.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Test"> 

    <Style TargetType="{x:Type local:CustomControl}"> 
     <Setter Property="BorderThickness" Value="10"/> 
    </Style> 

</ResourceDictionary> 

ファイルCustomControl.cs

namespace Test 
{ 
    public class CustomControl : TextBox 
    { 
     static CustomControl() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl))); 
     } 
    } 
} 
+0

問題は、あなたがコントロールを初期化するのを忘れたということです。 – macieqqq

+0

カスタムコントロールを使用して、何を達成したいですか?スタイリングの目的では、スタイルを使用することができます。 - 継承上の構成。 –

+0

@macieqqqそして初期化するには? – crupest

答えて

1

その中には何もありませんここに私の最終的なコードです。テンプレートが必要です。

これを行うには2通りの方法があります。まず、StyleをデフォルトのTextBoxのスタイルに基づいて設定します。それはあなたにデフォルトのテンプレートとそれ以外のものをデフォルトスタイルで与えます。必要に応じて、継承されたものをオーバーライドするためにセッターを自由に追加します。

<Style 
    TargetType="{x:Type local:MyCustomControl}" 
    BasedOn="{StaticResource {x:Type TextBox}}" 
    > 
    <Setter Property="BorderThickness" Value="10"/> 
    <Setter Property="BorderBrush" Value="Black"/> 
</Style> 

第二に、独自のテンプレートを作成します。デフォルトのテンプレートがあなたのためにやってくれないことをする必要があることがわかったら、あなたはこのようにします。しかし、コントロールの振る舞いは、あなたが思っていたよりもはるかに複雑であることが常に判明しています。これらは時々深水になることがあります。

Here's some documentation about retemplating a TextBox or a subclass of a TextBox

あなたはこれよりも多くのプロパティを入力する必要がありますが、ここでのスタートだよ:

<Style 
    TargetType="{x:Type local:MyCustomControl}" 
    BasedOn="{StaticResource {x:Type TextBox}}" 
    > 
    <Setter Property="BorderThickness" Value="10"/> 
    <Setter Property="BorderBrush" Value="Black"/> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:CustomControl}"> 
       <Border 
        BorderThickness="{TemplateBinding BorderThickness}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        > 
        <ScrollViewer Margin="0" x:Name="PART_ContentHost"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

それは動作します。しかし、ところで、テンプレートのプロパティが強要される理由を教えてください。 – crupest

+0

@crupest更新を参照してください。私の最初の答えは、既存のコントロールのサブクラスではなく、完全にオリジナルのコントロールであれば、あなたがしなければならないことでした。サブクラスの場合、通常は代わりにデフォルトのテンプレートを継承できます。 –

関連する問題