トップ回答者
WPF4以上におけるBevel効果の利用について

質問
-
現在、WPFを利用したGUIを構築していますが、その中でBevel効果を利用したいと考えております。
しかしながら、Bitmapeffect内のBevel効果はWPF4以上において記述しても効果が表れてくれません。
WPF3.5以下を利用すればいいだけの話なのですが、機能的にWPF4以上が魅力的です。WPF4以上でBevel効果を利用する方法はないのでしょうか?
参考に、効果が表れなかった際の記述をおいておきます。
<Rectangle Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="88" Margin="270,268,0,0" Stroke="Black" VerticalAlignment="Top" Width="144">
<Rectangle.BitmapEffect>
<BevelBitmapEffect EdgeProfile="CurvedOut" BevelWidth="20" Relief="0.5" Smoothness="0.5"/>
</Rectangle.BitmapEffect>
</Rectangle>
回答
-
すでにご覧になられているかもしれませんが、同内容の過去スレッドがありましたのでリンクしておきます。
XAMLに書いたBevelBitmapEffectが機能しない
https://social.msdn.microsoft.com/Forums/netframework/ja-JP/b1417bc3-7d16-4f4b-b07d-ca83fa62ae38/xamlbevelbitmapeffect?forum=wpfja- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月6日 6:22
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年11月13日 4:59
-
質問をするときは最低限のマナーとして、開発環境のバージョンを詳しく書きましょう。
WPF4でBevelをどうしても実現したければ、以下のような方法もあります。
Simple Adorner-Based Bevel Effect - CodeProject
単純な矩形に対するBevelであれば、半透明のPolygon要素(台形)を四隅にオーバーレイしたり、それをControlTemplateでStyle化したりするアドホックな方法でも切り抜けられると思います。
もしTextBlockなどの任意形状に対してBevelをかける必要があれば、自前でHLSLを使ってカスタムシェーダーエフェクトを記述する方法しかないと思われます。簡単に思いつくのはアルファマップ(アルファチャンネル)にerode/dilateアルゴリズムを適用した結果を、もとのアルファマップから差し引いたマスクを用いて、シェーダー定数で渡された光源情報をもとにBevelエッジ部の陰影計算を行なう方法です。モルフォロジー演算は適用対象を2値化すれば簡単に実装できますが、アンチエイリアスが必要な場合は複雑になります。
どこまでの機能を実現したいのか、まず要求仕様をはっきりさせて、その後で実現手段を検討・調査・選択してださい。
- 編集済み sygh 2017年11月5日 10:58
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月6日 6:22
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年11月13日 4:59
すべての返信
-
すでにご覧になられているかもしれませんが、同内容の過去スレッドがありましたのでリンクしておきます。
XAMLに書いたBevelBitmapEffectが機能しない
https://social.msdn.microsoft.com/Forums/netframework/ja-JP/b1417bc3-7d16-4f4b-b07d-ca83fa62ae38/xamlbevelbitmapeffect?forum=wpfja- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月6日 6:22
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年11月13日 4:59
-
質問をするときは最低限のマナーとして、開発環境のバージョンを詳しく書きましょう。
WPF4でBevelをどうしても実現したければ、以下のような方法もあります。
Simple Adorner-Based Bevel Effect - CodeProject
単純な矩形に対するBevelであれば、半透明のPolygon要素(台形)を四隅にオーバーレイしたり、それをControlTemplateでStyle化したりするアドホックな方法でも切り抜けられると思います。
もしTextBlockなどの任意形状に対してBevelをかける必要があれば、自前でHLSLを使ってカスタムシェーダーエフェクトを記述する方法しかないと思われます。簡単に思いつくのはアルファマップ(アルファチャンネル)にerode/dilateアルゴリズムを適用した結果を、もとのアルファマップから差し引いたマスクを用いて、シェーダー定数で渡された光源情報をもとにBevelエッジ部の陰影計算を行なう方法です。モルフォロジー演算は適用対象を2値化すれば簡単に実装できますが、アンチエイリアスが必要な場合は複雑になります。
どこまでの機能を実現したいのか、まず要求仕様をはっきりさせて、その後で実現手段を検討・調査・選択してださい。
- 編集済み sygh 2017年11月5日 10:58
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月6日 6:22
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年11月13日 4:59