質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

3874閲覧

WPFでのカスタムコントロールの作り方が分かりません。

nekome4

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/09/11 17:30

編集2018/09/12 00:14

WPFでカスタムコントロールを作ろうと調べましたがどこも情報が少なくわからない状態です。

サイトの内容等から手探りで作りましたが、どうしてもそのカスタムコントロールがおかしい?のです。
例えばTextBoxをベースにして適当にデザイナで配置&実行しTextBoxを編集しようとすると本来現れるはずのキャレットが出ずに入力ができません。
十中八九やり方がおかしいのですがどこがおかしいのかわらず途方に暮れております。

以下カスタムコントロールを作成した時の手順です。

1.プロジェクトから新しい項目の追加>WPFでカスタムコントロールを作成
2.カスタムコントロールのクラスの継承元をControlからTextBoxに変更。
3.Generic.xamlで以下のように再編集。

<Style TargetType="{x:Type local:CustomControl1}" BasedOn="{StaticResource {x:Type TextBox}}"> 後は何処も弄らずにビルドし実行。 コードにすると以下のようになっています。 [CustomControl1.cs の一部] ```C# public class CustomControl1 : TextBox { static CustomControl1() {      DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1))); } } ``` こちらもBasedOnを指定しただけです。 [Generic.xaml の一部] ```xaml <Style TargetType="{x:Type local:CustomControl1}" BasedOn="{StaticResource {x:Type TextBox}}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type local:CustomControl1}"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
元々カスタムコントロールは上記手順を踏まず、普通に.csファイル単体を作成して記述していました。 その場合は普通に入力編集などできていたのでそれでよいのかと思いましたがこの方法は間違っているのでしょうか? ご教示お願いいたします。 また、どこかわかりやすいサイトなどありましたらお願いいたします。 #VS2017 Community

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Styleで<Setter Property="Template">しているからでは?
コードはそのままで以下でどうでしょう。

[Generic.xaml]

xml

1 <Style TargetType="{x:Type local:CustomControl1}" BasedOn="{StaticResource {x:Type TextBox}}"> 2 <Style.Triggers> 3 <Trigger Property="IsMouseOver" Value="true"> 4 <Setter Property="Background" Value="#3c3c3c"/> 5 </Trigger> 6 </Style.Triggers> 7 <!--<Setter Property="Template"> 8 <Setter.Value> 9 <ControlTemplate TargetType="{x:Type local:CustomControl1}"> 10 <Border Background="{TemplateBinding Background}" 11 BorderBrush="{TemplateBinding BorderBrush}" 12 BorderThickness="{TemplateBinding BorderThickness}"> 13 14 </Border> 15 </ControlTemplate> 16 </Setter.Value> 17 </Setter>--> 18 </Style>

投稿2018/09/12 10:51

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekome4

2018/09/12 12:25

ご返信ありがとうございます。 コメントアウトした箇所を削除したところ入力キャレットがでるようになり、マウスオーバーした時のスタイルも適用されていました。 「<Setter Property="Template">」の記述がスタイル全体を上書きしてしまっていたのが原因だったのですね。 これについてもうしばらく調べ直してみます。 ありがとうございました。
guest

0

ベストアンサー

BasedOn はスタイルを継承するためのものです。
クラス自体を継承するには C# の方で指示してください。

C#

1class MyClass : BaseClass 2{ 3}

###追記

次のようにしてください。

C#

1public class CustomControl1 : TextBox 2{ 3 static CustomControl1() 4 { 5 DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(TextBox))); 6 } 7}

新規作成からの変更箇所は「: TextBox」と「FrameworkPropertyMetadata(typeof(TextBox))」です。
これでキャレットが出ることが確認できました。
もしかしたら変更後ソリューションのリビルドが必要かもしれません。

投稿2018/09/11 22:04

編集2018/09/12 00:58
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekome4

2018/09/12 00:16

ご返信ありがとうございます。 カスタムコントロールのクラスはTextBoxを継承しております。 このままCustomControl1をデザイナから適当に配置しても何もでないのでBaseOnを指定してTextBoxのスタイルを継承したつもりなのですが、真っ白のままで入力を受け付けません。 やりたいこととしては既存のコントロールを継承したカスタムコントロールを作りたいのです。 以前とっていた方法は間違いでこの方法が本当に正しいのかもよくわかりません。 #質問を編集しなおしました。
nekome4

2018/09/12 02:41

ご返信ありがとうございます。 おお、確かに出ますね。 でもそうしてしまうとOverrideMetadataというメソッド名から察するにTextBoxで上書きするという事になってしまいGeneric.xamlの意味がないような気がしましたがどうなんでしょう・・・・。
Zuishin

2018/09/12 02:44

Generic.xaml は変更する必要ありません。また別の目的で必要になったら書き換えてください。
nekome4

2018/09/12 10:15

いろいろやってみたのですが、やはりGeneric.xamlが適用されないようです。 示したコードはわかりやすいようデフォルトの状態で実際にはGeneric.xamlのスタイルを適用するつもりです。 </Setter.Value>の下に以下のコードを入れてみましたが「new FrameworkPropertyMetadata(typeof(TextBox))」とするとスタイルが適用されず、元に戻すと入力はできないものの背景色が変わりました。 ん~謎です。 <Style.Triggers> <Trigger Property="IsMouseOver" Value="true"> <Setter Property="Background" Value="#3c3c3c"/> </Trigger> </Style.Triggers>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問