32576


OS: Windows7、Windows10  
.NET Framework: 3.0、4.5  
開発環境: VisualStudio 2013、VisualStudio 2015

WPFで作ったアプリケーションの操作に違和感を覚えることがあり、その原因を調査してみました。  
以下が、その違和感を再現できたコードです。

XAML

[code]

    <Window 
        x:Class="WpfSandBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Height="200" 
        Width="200">
        <Grid>
            <Button HorizontalAlignment="Center" VerticalAlignment="Center" Click="OnClick">
                <Button.ContextMenu>
                    <ContextMenu><MenuItem Header="メニュー"/></ContextMenu>
                </Button.ContextMenu>
                <Grid>
                    <TextBlock Text="Button"/>
                    <Popup x:Name="MyPopup" StaysOpen="False">
                        <StackPanel Background="Yellow"><TextBlock Text="Popup"/></StackPanel>
                    </Popup>
                </Grid>
            </Button>
        </Grid>
    </Window>
    
[/code]

C#

[code]

    private void OnClick(object sender, RoutedEventArgs args)
    {
        MyPopup.IsOpen = true;
    } 
    
[/code]

操作手順は以下の通りです。

  1. ボタンをクリックしてポップアップを表示するか、右クリックでメニューを表示します。
  2. 表示した状態のままマウスの操作で自身のウインドウのタイトルバーからドラッグ、最大化、最小化、閉じるのいずれかしようとします。
  3. ポップアップやメニューは消えますが、タイトルバーへの操作が受け付けられていません。
  4. もう一度タイトルバーをマウスで操作した際には問題ありません。

意外と素早く操作を行うときはこの条件に引っかかってしまい、操作がもたついていたようです。  
WPF 以外では今のところ確認できないので、何とか回避する方法はないでしょうか。

[ソースコード](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/Primitives/Popup.cs,40ab7810a8f8c8f6)を確認するとWndProcでクリックをキャンセルしてるように見えるのでかなり厳しいですが…


CC BY-SA 3.0
2017-02-10T15:24:59.247
32569
2017-02-11T03:10:41.153
70
question
c# wpf
PopupやContextMenuを閉じるときのマウス操作で、タイトルバーを操作したい


`Popup`の表示中に他の`Button`などをクリックすると1回で`Click`イベントが発生しますので、`Window`のコントロールボックス特有の問題なのだと思われます。  
従って[`WindowChrome`](https://msdn.microsoft.com/ja-
jp/library/system.windows.shell.windowchrome.aspx)を使用して標準コントロールボックスを通常の`Button`で上書きすれば改善するでしょう。

`WindowChrome`の自作は結構な手間になるので割愛しますが、[`MahApps.Metro.MetroWindow`](http://mahapps.com/)などの出来合いの`Window`派生型を使用すれば手軽に効果が確認できるかと思います。


CC BY-SA 3.0
2017-02-11T03:10:41.153
32576
2017-02-11T03:10:41.153
5750
32569
answer