• ベストアンサー

WPFテンプレート作成時のエラー「iAddChild」ついて

VB2008にて、WPFを使用してコントロールのテンプレートを作成しているのですが、エラーの解決策が分からず困っています。 ボタンの見た目を二重丸(このような形→◎)にするため、○を2つ作成してテンプレートにしているのですが、ボタンにセットする段階でエラーが発生してしまいます。 (エラーの内容) 'System.InvalidOperationException' の初回例外が PresentationFramework.dll で発生しました。 'Ellipse' 型では、FrameworkElementFactory AppendChild で使用される IAddChild を実装する必要があります。 「FrameworkElementFactory AppendChild で使用される IAddChildの実装」とは、具体的にどのようなことを行えば良いのでしょうか? Ellipse型を継承したクラスを自分で作成して、IAddChildインタフェースを 実装するということなのでしょうか。 ネットで調べたり色々コードを修正して試したのですが、解決できませんでした。 「iAddChildの実装」についてご存知の方がいらっしゃいましたら、ご教示願います。 (作成したプログラム) '外側○の作成 Dim ellipse1 As FrameworkElementFactory =   New FrameworkElementFactory(GetType(Ellipse)) ellipse1.SetValue(Ellipse.WidthProperty, System.Convert.ToDouble(40)) ellipse1.SetValue(Ellipse.HeightProperty, System.Convert.ToDouble(40)) ellipse1.SetValue(Ellipse.FillProperty, New SolidColorBrush(Colors.Blue)) '内側○の作成 Dim ellipse2 As FrameworkElementFactory =   New FrameworkElementFactory(GetType(Ellipse)) ellipse2.SetValue(Ellipse.WidthProperty, System.Convert.ToDouble(20)) ellipse2.SetValue(Ellipse.HeightProperty, System.Convert.ToDouble(20)) ellipse2.SetValue(Ellipse.FillProperty, New SolidColorBrush(Colors.Pink)) '内側○を外側○の子要素とする ellipse1.AppendChild(ellipse2) 'テンプレートを作成 Dim template As ControlTemplate =New ControlTemplate template.VisualTree = ellipse1 'ボタンにテンプレートをセット Dim testButton As Button = New Button testButton.Template = template   ←←エラーが発生する箇所

質問者が選んだベストアンサー

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

<Ellipse> <Ellipse></Ellipse> </Ellipse> この記述は正しくありませんので、エラーになっています。 解決方法としては、 >Ellipse型を継承したクラスを自分で作成して、IAddChildインタフェースを 実装するということなのでしょうか。 は正しいです。 しかし、 そんなに面倒なことをすることはありません。 2重マルをかければよいということですので、 たとえば、 <Canvas> <Ellipse Canvas.ZIndex="0"></Ellipse> <Ellipse Canvas.ZIndex="1"></Ellipse> </Canvas> このようにすれば、Ellipseを重ねて表示することができます。 要するに、 パネル系の要素、すなわちIAddChildを実装している要素を、 親として持たせれば、円を重ねることを実現することができます。 ほかには、 InkPresenterを使用する方法があります。

noname#250976
質問者

お礼

ご回答ありがとうございます。 Canvasの子要素にEllipseを2つ追加することで、◎を描画できることを確認できました。 ZIndexプロパティの利用で子要素の順番を指定できるということも、初めて知りました。今後、有効に活用していきたいと思います。 他に紹介して頂いた方法についても、色々試してみて描画処理の手段の知識として身につけたいと思います。 困っていたところだったので、本当に助かりました。ありがとうございました!

その他の回答 (1)

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.2

参考になればよいです。 http://www.oborodukiyo.info/WPF/VS2008/WPF-DifferenceBetweenXAMLAndCode.aspx XAMLとコードでの対応を考えてやってみるとわかりやすいのかもしれません。

noname#250976
質問者

お礼

ご回答ありがとうございます。 紹介して頂いたページの「Window2.xaml.cs」のプログラムを参考に作成した結果、◎を描画することができました。 Gridに子要素としてellipseを2つ追加すると、内側の○の位置が自動で、外側の○の中央の位置に配置されるものなのですね。 Canvasの子要素とした場合は内側・外側○共に描画基点が同じだったので、どうしてGridだと自動で位置調整されるのかが分からなかったのですが、その点については自分でもXAMLとの比較等で少しずつ調べていきたいと思います。 ページの紹介があって非常に分かりやすかったです。 本当にありがとうございました!

関連するQ&A