3

問題はここで説明されているものと実質的に同じです:http ://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/542b827a-7c8e-4984-9158-9d8479b2d5b1しかし、私は受け入れられた答えに満足していませんそこにいて、より良い解決策があるはずだと感じています...

リストビューに(AppBarではなくPopupMenuを介して)「clasic」コンテキストメニューを実装しようとしていますが、リストビューを「None」SelectionModeに設定した場合にのみ正常に機能します。

上記のリンクは、ListViewが「なし」選択モード以外に設定されている場合、ListViewItemが右タップされたイベントを「飲み込む」ことを正しく説明しています。この動作をオーバーライドして、リストビューのアイテムが選択され、リストビューでRightTappedイベントが発生し、それに反応できるようにするにはどうすればよいですか?

4

3 に答える 3

7

ListView クラスと ListViewItem クラスの両方をサブクラス化することで問題を解決したと思います。

public class MyListView : ListView
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new MyListViewItem();
    }
}

public class MyListViewItem : ListViewItem
{
    protected override void OnRightTapped(Windows.UI.Xaml.Input.RightTappedRoutedEventArgs e)
    {
        base.OnRightTapped(e);
        e.Handled = false; // Stop 'swallowing' the event
    }
}

<CustomControls:MyListView
    x:Name="MyListView"
    ...
    SelectionMode="Single"
    RightTapped="MyListView_RightTapped">
</CustomControls:MyListView>

この単純なアプローチにより、SelectionMode が「Single」、「Multiple」、または「Extended」に設定されていても、MyListView_RightTapped ハンドラーが呼び出されます。ただし、次の問題は、この小さな勝利がアプリケーション UI の優れた設計につながるかどうかです。ここではその質問に答えようとしません...

于 2012-05-08T19:16:55.060 に答える
1

GridViewItem で PointerPressed/PointerReleased イベントを使用して、RightTapped または ManipulationCompleted から得られるのと同じ効果を得ることができます。

    <ListView
        Margin="120,80,0,0"
        SelectionMode="Multiple">
        <ListView.ItemContainerStyle>
            <Style
                TargetType="ListViewItem">
                <Setter
                    Property="Width"
                    Value="100" />
                <Setter
                    Property="Height"
                    Value="100" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListViewItem
            RightTapped="ListViewItem_RightTapped_1"
            PointerPressed="ListViewItem_PointerPressed_1"
            PointerReleased="ListViewItem_PointerReleased_1"
            ManipulationStarted="ListViewItem_ManipulationStarted_1">
            <Rectangle
                Height="80"
                Width="80"
                Fill="Red" />
        </ListViewItem>
    </ListView>

.

    private void ListViewItem_RightTapped_1(object sender, RightTappedRoutedEventArgs e)
    {
        Debug.WriteLine("Tap");
    }

    private void ListViewItem_PointerPressed_1(object sender, PointerEventArgs e)
    {
        Debug.WriteLine("Press");
    }

    private void ListViewItem_ManipulationStarted_1(object sender, ManipulationStartedRoutedEventArgs e)
    {
        Debug.WriteLine("Manipulating");
    }

    private void ListViewItem_PointerReleased_1(object sender, PointerEventArgs e)
    {
        Debug.WriteLine("Release");
    }
}

出力:

プレスリリース プレスリリース

*編集

申し訳ありませんが、タッチとマウスではこれらのイベントの動作が異なることをどうにか見逃していたに違いありません。あなたが得た答えは、あなたが得られる最高のものかもしれないと思います。それ以外の場合は、独自のバージョンの ListView を実装する必要があります。将来のリリースでより良い解決策が得られることを期待して彼らに圧力をかけることもできますが、私はそこに多くを望んでいません. 私の記憶では、ContextMenus はあまりメトロではなく、右クリック メニューよりも優れた UX ソリューションがあります。コマンドは、AppBar または項目を選択した後に開く詳細ページに表示できます。これは、サポートされるように設計されていない何かの回避策をハックしようとするよりもうまくいく可能性があります.

于 2012-05-08T04:25:32.157 に答える