none
WPF Adornerによる装飾の方法 RRS feed

  • 質問


  • 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に適用させる方法を教えて下さい。

    2016年5月7日 12:17

回答

  • こんにちは。

    サンプルでは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
    2016年5月7日 16:23
    モデレータ

すべての返信

  • 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 半角スペース落ちの件を追記
    2016年5月7日 13:54
  • こんにちは。

    サンプルでは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
    2016年5月7日 16:23
    モデレータ
  • Tak1waさん、ありがとうございました。
    たった今確認でき、予想通りの運用ができました。

    皆様の迅速、的確な御回答には頭が下がります。今後もよろしくお願い致します。

    2016年5月8日 0:10
  • 御回答ありがとうございます。

    御指摘のコードがあるのは分かっていましたが、いきなり使われているmyAdornerLayer、及びmyTextBoxという変数の意味が分からず、当然ながらコンパイルしてもエラーになるだけで、ギブアップした次第です。

    myAdornerLayerという変数がAdornerLayer型のオブジェクトであるということは、これを見ただけでどうやって分かるのでしょうか。

    MSDNライブラリーの、こういった不親切な記述は、なくしてもらいたいです。

    2016年5月8日 0:21
  • 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 と宣言すれば良いのですね。


    2016年5月8日 3:30
  • 御回答ありがとうございます。私の知識が浅くて、お手数をお掛けしました。

    方法はよく分かりました。今後から利用致します。
    コードの書き方が分からずギブアップしたのは、SimpleCircleAdornerクラスのOnRenderメソッドというものがあり、これを呼び出さないのになぜ描画が完成しているのか、とても疑問に感じたことも理由でした。外部ルーチンからわざわざOnRenderを使ったプログラムを書いても動作せず(そりゃそうだよね)、諦めた次第です。


    2016年5月9日 8:15