astel-labs.net

C#などのプログラミングTipsや雑記をつらつらと書くかもしれないブログです。

  • Home
RSS

WPF – クライアント領域にグラス効果を適用する

Posted on 2011年4月15日 by Nymphaea
No CommentsLeave a comment

今回も海外サイトを眺めていた時に見つけたサンプルになります

ただ、海外のサイトも断片的な情報しかなかなか見つからなかったため、ほかのサイトやMSDNを巡ってそれっぽい感じのサンプルに作り直してみました

サンプルの見た目はこんな感じ

 

 

サンプルで意外と面倒だったのは、ウィンドウアイコンやウィンドウタイトルの配置でした…

見つけたサンプルではアイコンが純粋なボタンスタイルで配置されていたり、タイトルの背景にブラー的なエフェクトがかかっていなく背景が黒いと見難かったりしたので、適当にそれっぽく見えるように追加してみました

タイトルの背景が若干白っぽく浮いて見えるようにスクリーンショットを撮ってみましたが、あんまりわからないですね…

 

グラス効果を利用するには、「Microsoft Ribbon for WPF」を予めインストールして組み込んでおく必要があります

リンク先のページから「Microsoft Ribbon for WPF.msi」をダウンロードしてインストールしたら、Visual Studio を再起動して通常通りプロジェクトの作成で「WPF アプリケーション」プロジェクトを作成します

プロジェクトを作成したら、「参照設定」から「参照の追加」で「.NET」のタブから「Microsoft.Windows.Shell」のアセンブリを追加します
グラス効果を利用するにはこのアセンブリが必須ですので注意してください

 

以下のサンプルプログラムは前回のステータスバーのコードを流用しています…

<Window x:Class="GlassStyleTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"
        xmlns:local="clr-namespace:GlassStyleTest"
        Title="MainWindow" Height="350" Width="360" Icon="DfIcon.ico"
        x:Name="ChromeWindow">
    <Window.Resources>
        <Style x:Key="GadgetStyle" TargetType="{x:Type local:MainWindow}">
            <Setter Property="shell:WindowChrome.WindowChrome">
                <Setter.Value>
                    <shell:WindowChrome GlassFrameThickness="-1"
                                        ResizeBorderThickness="6"
                                        CaptionHeight="25" />
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:MainWindow}">
                        <Grid>
                            <!-- ウィンドウアイコンの設定 -->
                            <Button VerticalAlignment="Top" HorizontalAlignment="Left" Padding="1"
                                    Margin="{Binding RelativeSource={RelativeSource TemplatedParent},
                                    Path=(shell:WindowChrome.WindowChrome).ResizeBorderThickness}"
                                    shell:WindowChrome.IsHitTestVisibleInChrome="True"
                                    Command="{x:Static shell:SystemCommands.ShowSystemMenuCommand}"
                                    CommandParameter="{Binding ElementName=ChromeWindow}">
                                <!-- アイコンの背景を透過するためにスタイルを再設定 -->
                                <Button.Style>
                                    <Style TargetType="{x:Type Button}">
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="Button">
                                                    <ContentPresenter VerticalAlignment="Center"
                                                                      HorizontalAlignment="Center" />
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </Button.Style>
                                <!-- アイコンイメージの設定 -->
                                <Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
                                       Width="16" Height="16"
                                       shell:WindowChrome.IsHitTestVisibleInChrome="True" />
                            </Button>
                            <!-- ウィンドウタイトルを見やすくするために背景に白いぼかしを設定 -->
                            <TextBlock VerticalAlignment="Top" TextAlignment="Left"
                                       Padding="27,6,0,0" Foreground="White"
                                       Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}">
                                <TextBlock.Effect>
                                    <BlurEffect KernelType="Box" Radius="8" />
                                </TextBlock.Effect>
                            </TextBlock>
                            <!-- ウィンドウタイトルを設定 -->
                            <TextBlock VerticalAlignment="Top" TextAlignment="Left"
                                       Padding="27,6,0,0" Foreground="Black"
                                       Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}" />
                            <!-- クライアントエリアの設定 -->
                            <Border Margin="6,26,6,6" BorderBrush="Gray" BorderThickness="1,1,1,1">
                                <ContentPresenter Content="{TemplateBinding Content}" />
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <DockPanel>
        <!-- コントロールを配置する際は Opacity プロパティを設定することで
            グラス効果を持った状態で透過効果を設定することができます -->
        <StatusBar DockPanel.Dock="Bottom" Opacity="0.8">
            <StatusBarItem DockPanel.Dock="Right">アイテム3</StatusBarItem>
            <Separator DockPanel.Dock="Right" />
            <StatusBarItem DockPanel.Dock="Right">アイテム2</StatusBarItem>
            <Separator DockPanel.Dock="Right" />
            <StatusBarItem>アイテム1</StatusBarItem>
        </StatusBar>
        <TextBox Opacity="0.5"></TextBox>
    </DockPanel>
</Window>

 

xaml コード以外にも、グラス効果を適用できない環境も考慮するため、アプリケーションロード時にグラス効果が利用可能かを判断してからスタイルを適用しています

using System.Windows;
using Microsoft.Windows.Shell;

namespace GlassStyleTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler( MainWindow_Loaded );
        }

        private void MainWindow_Loaded( object sender, RoutedEventArgs e )
        {
            // グラス効果が利用できるかを確認してスタイルを適用する
            this.Style = SystemParameters2.Current.IsGlassEnabled
                ? (Style)Resources["GadgetStyle"] : null;
        }
    }
}

 

グラス効果を確認するために、「デスクトップのカスタマイズ」から「ウィンドウの色とデザイン」で色設定を変更すると、クライアントエリアを含めた透過領域の配色がきちんと反映されていることも確認できます

 

また、グラス効果を利用する際には、Microsoft からガイドラインが発表されていますのでこちらも参考にするとよいでしょう

Categories: WPF, プログラミング

 

ホスティング会社やいろんなものを変えてみた
WPF – StatusBarItemの右寄せ

コメントを残す

コメントを投稿するにはログインしてください。

  • 2011年4月
    日 月 火 水 木 金 土
     12
    3456789
    10111213141516
    17181920212223
    24252627282930
    « 1月   4月 »
  • 最近の投稿

    • raspberry pi に nginx をセットアップする
    • VSCode を日本語化する
    • raspberry pi に VSCode をインストールする
    • WindowsのプロダクトIDを取得する
    • SQL Server – money型とdecimal型を併用した金額計算
  • アーカイブ

    • 2020年3月
    • 2016年12月
    • 2014年6月
    • 2014年5月
    • 2013年7月
    • 2012年11月
    • 2012年7月
    • 2012年5月
    • 2012年4月
    • 2011年4月
    • 2011年1月
    • 2010年11月
    • 2010年10月
    • 2010年9月
    • 2010年8月
    • 2010年7月
    • 2010年6月
    • 2010年5月
    • 2010年4月
  • カテゴリー

    • C#
    • jQuery
    • OpenCV
    • raspberry pi
    • SharePoint
    • Silverlight
    • SQL Server
    • WCF
    • WPF
    • プログラミング
    • 未分類
    • 雑記
© astel-labs.net. Proudly Powered by WordPress | Nest Theme by YChong

このブログ内で公開されているソースコードおよびサンプルプログラムに関わるライセンスはすべて修正BSDライセンス(New BSD License)として公開しています。
但し、サンプルプログラムに含まれる外部アセンブリが同様のライセンスとは限りませんので、利用する前に必ずすべてのライセンスの確認を行ってください。