トップ回答者
WPF Adornerによる装飾の方法

質問
-
MSDNライブラリーで、装飾の概要という解説があるのですが、
https://msdn.microsoft.com/ja-jp/library/ms743737%28v=vs.110%29.aspx下のクラスを呼び出すコードが記載されておらず、プログラムが書けません。
PublicClass SimpleCircleAdorner Inherits Adorner SubNew(ByVal adornedElement As UIElement) MyBase.New(adornedElement) EndSubProtectedOverridesSub OnRender(ByVal drawingContext As System.Windows.Media.DrawingContext) MyBase.OnRender(drawingContext) Dim adornedElementRect AsNew Rect(AdornedElement.DesiredSize) Dim renderBrush AsNew SolidColorBrush(Colors.Green) renderBrush.Opacity = 0.2 Dim renderPen AsNew Pen(New SolidColorBrush(Colors.Navy), 1.5) Dim renderRadius AsDouble renderRadius = 5.0 'Draw a circle at each corner. drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius) drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius) drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius) drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius) EndSubEndClass
GridにCombobox(Name="ComboBox1")を1つ配置しただけの状態で、この装飾をComboBoxに適用させる方法を教えて下さい。
回答
-
こんにちは。
サンプルではmyTextBoxを指定していますが、ComboBox1を指定するだけです。
Class MainWindow Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Dim myAdornerLayer As AdornerLayer = AdornerLayer.GetAdornerLayer(ComboBox1) myAdornerLayer.Add(New SimpleCircleAdorner(ComboBox1)) End Sub End Class Public Class SimpleCircleAdorner Inherits Adorner Sub New(ByVal adornedElement As UIElement) MyBase.New(adornedElement) End Sub Protected Overrides Sub OnRender(ByVal drawingContext As System.Windows.Media.DrawingContext) MyBase.OnRender(drawingContext) Dim adornedElementRect As New Rect(AdornedElement.DesiredSize) Dim renderBrush As New SolidColorBrush(Colors.Green) renderBrush.Opacity = 0.2 Dim renderPen As New Pen(New SolidColorBrush(Colors.Navy), 1.5) Dim renderRadius As Double renderRadius = 5.0 'Draw a circle at each corner. drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius) drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius) drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius) drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius) End Sub End Class
- 回答としてマーク huahi11112 2016年5月8日 0:04
すべての返信
-
huahi11112 さま よろしく。
お書きのコードの少し下 「単一の UIElement を装飾する」 に、コードありませんか?。 (以下のリンクですね。)
https://msdn.microsoft.com/ja-jp/library/ms743737%28v=vs.110%29.aspx
次の例では、SimpleCircleAdorner (前述) を TextBox (名前は myTextBox) にバインドしています
の後です。
参考までに、 ご質問文のコードでは 半角スペースが省略されていますが 、お分かりでしょうか?。 msdn のコードと見比べて下さいね。- 編集済み ShiroYuki_Mot 2016年5月7日 14:01 半角スペース落ちの件を追記
-
こんにちは。
サンプルではmyTextBoxを指定していますが、ComboBox1を指定するだけです。
Class MainWindow Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Dim myAdornerLayer As AdornerLayer = AdornerLayer.GetAdornerLayer(ComboBox1) myAdornerLayer.Add(New SimpleCircleAdorner(ComboBox1)) End Sub End Class Public Class SimpleCircleAdorner Inherits Adorner Sub New(ByVal adornedElement As UIElement) MyBase.New(adornedElement) End Sub Protected Overrides Sub OnRender(ByVal drawingContext As System.Windows.Media.DrawingContext) MyBase.OnRender(drawingContext) Dim adornedElementRect As New Rect(AdornedElement.DesiredSize) Dim renderBrush As New SolidColorBrush(Colors.Green) renderBrush.Opacity = 0.2 Dim renderPen As New Pen(New SolidColorBrush(Colors.Navy), 1.5) Dim renderRadius As Double renderRadius = 5.0 'Draw a circle at each corner. drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius) drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius) drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius) drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius) End Sub End Class
- 回答としてマーク huahi11112 2016年5月8日 0:04
-
御回答ありがとうございます。
御指摘のコードがあるのは分かっていましたが、いきなり使われているmyAdornerLayer、及びmyTextBoxという変数の意味が分からず、当然ながらコンパイルしてもエラーになるだけで、ギブアップした次第です。
myAdornerLayerという変数がAdornerLayer型のオブジェクトであるということは、これを見ただけでどうやって分かるのでしょうか。
MSDNライブラリーの、こういった不親切な記述は、なくしてもらいたいです。
- 編集済み huahi11112 2016年5月8日 0:26
-
huahi11112さま 拝見しました。
コードを書く事にまだお慣れになっていないものとして書いて見ます。
myAdornerLayerという変数がAdornerLayer型のオブジェクトであるということは、これを見ただけでどうやって分かるのでしょうか。>
いかに手順を。
サンプルに従って、ComboBox1 に書き換えます。Class MainWindow Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) myAdornerLayer = AdornerLayer.GetAdornerLayer(ComboBox1) myAdornerLayer.Add(New SimpleCircleAdorner(ComboBox1)) End Sub End Class
この時、myAdornerLayer には波線が引かれ定義していないと怒られます。
右辺の GetAdornerLayer が右辺の返す型になるので、これにマウスを合わせれば、
Public Shared Function GetAdornerLayer ... As ...AdornerLayer と表示されていると思います。
(下段は説明文)
これが、左辺に期待される型となります。
ですから、Dim myAdornerLayer As AdornerLayer と宣言すれば良いのですね。