12

WindowChromeライブラリのクラスをチェックアウトしていましたSystem.Windows.Shell(v 3.5.41019.1)。テンプレートを作成しようとすると、テンプレート内の要素Windowのマージンは効果がないようです:Border

<Window x:Class="WpfApplication7.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"
        Title="MainWindow" Height="350" Width="525" Style="{DynamicResource WindowStyle1}">
    <Window.Resources>
        <Style x:Key="WindowStyle1" TargetType="{x:Type Window}">
<!-- Here is the WindowChrome.-->
            <Setter Property="shell:WindowChrome.WindowChrome">
                <Setter.Value>
                    <shell:WindowChrome />
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Window}">
<!-- And here is the Border. Its margin has no effect as far as I can tell.-->
                        <Border Margin="25" Background="Red">
                            <AdornerDecorator>
                                <ContentPresenter/>
                            </AdornerDecorator>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>

    </Grid>
</Window>

その理由は何だと思いますか。一部の人々が次のようなものを使用しているのを見たので、私はそれを疑問に思っています*:

<Border x:Name="WindowBorder" Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}" Background="Red">

しかし、私のテストでは何の効果もなかったので、これを行うポイントは何でしょうか?

(*) それが使用される場所の 1 つは、CodePlexのModernUIプロジェクトです。

編集: Aero をオンにした Windows 7 でこれをテストしました。

編集 2: Aero をオフにしても同じです。

4

3 に答える 3

9

MSDN によると、WindowChrome

ウィンドウの非クライアント領域に対するカスタマイズを記述するオブジェクトを表します。

MSDN サンプルを読み、コードをしばらく再生した後、コードが MSDN サンプル コードの次のようになっていることに気付きました。

<Style x:Key="StandardStyle" TargetType="{x:Type local:MainWindow}">
<Setter Property="shell:WindowChrome.WindowChrome">
    <Setter.Value>
        <shell:WindowChrome />
    </Setter.Value>
</Setter>
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type local:MainWindow}">
            <!--Note there is a Grid as the root-->
            <Grid>
                <Border Background="White"
                        Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}">
                    <ContentPresenter Content="{TemplateBinding Content}" />
                </Border>
                <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}" 
                           VerticalAlignment="Top" HorizontalAlignment="Left" 
                           Margin="36,8,0,0"/>
                <Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
                       VerticalAlignment="Top" HorizontalAlignment="Left"
                       Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(shell:WindowChrome.WindowChrome).ResizeBorderThickness}" 
                       Width="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=SmallIconSize.Width}"
                       shell:WindowChrome.IsHitTestVisibleInChrome="True"/>
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

ウィンドウの NC をカスタマイズするためのいくつかの要素を含むルート要素として Grid があることに注意してください。

アップデート:

MSDN ページのコメントで気付くかもしれませんが、セクションが含まれています。

WindowStyle.None

WindowChrome

これらは、WPF アプリケーション ウィンドウの外観をカスタマイズする 2 つの方法です。

ただし、Window.WindowStyleプロパティをWindowStyle.None次のように設定します。

これにより、非クライアント フレームがウィンドウから削除され、カスタム スタイルを適用できるクライアント領域のみが残ります。ただし、非クライアント フレームが削除されると、キャプション ボタンやウィンドウのサイズ変更など、非クライアント フレームが提供するシステム機能と動作も失われます。もう 1 つの副作用は、ウィンドウを最大化すると、ウィンドウが Windows タスクバーを覆うことです。

次にWindowChrome、WPF を使用して NC のカスタマイズを有効にする方法を紹介します。

標準機能を維持しながらウィンドウをカスタマイズするには、WindowChrome クラスを使用できます。WindowChrome クラスは、ウィンドウ フレームの機能をビジュアルから分離し、アプリケーション ウィンドウのクライアント領域と非クライアント領域の間の境界を制御できるようにします。WindowChrome クラスを使用すると、クライアント領域を拡張して非クライアント領域をカバーすることにより、ウィンドウ フレームに WPF コンテンツを配置できます。同時に、2 つの目に見えない領域を通じてシステムの動作を保持します。リサイズ枠とキャプション領域。

質問に戻りますが、見つかったテンプレートは MSDN サンプル コードからコピーする必要がありますが、真の root がありませんGridでした。ボーダーのマージンは、NC にいくらかのスペースを与えるためのものです。MSDN サンプル コードでは、ContenPreseterにはクライアント領域のみが含まれ、NC にはBorderTextBlockウィンドウ タイトル、およびImageウィンドウ アイコンが含まれています。

要約すると、 設定WindowChromeにより、 のウィンドウの NC 領域をカスタマイズできますWindow.Template

注: サンプルの MSDN サンプル コードは、.Net 4.5 では少し古くなっSystem.Windows.Shell.WindowChromeているPresentationFramework.dllようです。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Style="{DynamicResource WindowStyle1}" Icon="Icon1.ico">
<Window.Resources>
    <Style x:Key="WindowStyle1" TargetType="{x:Type Window}">
        <Setter Property="WindowChrome.WindowChrome">
            <Setter.Value>
                <WindowChrome />
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Grid>
                        <Border Background="Red"
                        Margin="{Binding Source={x:Static SystemParameters.WindowNonClientFrameThickness}}">
                            <ContentPresenter Content="{TemplateBinding Content}" />
                        </Border>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}" 
                           VerticalAlignment="Top" HorizontalAlignment="Left" 
                           Margin="36,8,0,0"/>
                        <Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
                       VerticalAlignment="Top" HorizontalAlignment="Left"
                       Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=WindowChrome.WindowChrome.ResizeBorderThickness}" 
                       Width="{Binding Source={x:Static SystemParameters.SmallIconWidth}}"
                       WindowChrome.IsHitTestVisibleInChrome="True"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <Button />
</Grid>

于 2013-05-26T05:24:42.157 に答える