31

私は WPF アプリケーションを持っています..Xaml ファイルに Image コントロールがあります。

この画像を右クリックすると、コンテキスト メニューが表示されます。

「左クリック」でも同じように表示させたいです。

MVVM の方法でこれを行うにはどうすればよいですか?

4

8 に答える 8

17

このような Image の MouseDown イベントを使用してこれを行うことができます

<Image ... MouseDown="Image_MouseDown">
    <Image.ContextMenu>
        <ContextMenu>
            <MenuItem .../>
            <MenuItem .../>
        </ContextMenu>
    </Image.ContextMenu>
</Image>

そして、コードビハインドで EventHandler に ContextMenu を表示します

private void Image_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ChangedButton == MouseButton.Left)
    {
        Image image = sender as Image;
        ContextMenu contextMenu = image.ContextMenu;
        contextMenu.PlacementTarget = image;
        contextMenu.IsOpen = true;
        e.Handled = true;
    }
}
于 2010-11-29T16:37:55.510 に答える
3

コードビハインドを使用せずにXamlでこれを実行する場合は、ExpressionBlendのトリガーサポートを使用できます。

...
xmlns:i="schemas.microsoft.com/expression/2010/interactivity"
...

<Button x:Name="addButton">
    <Button.ContextMenu>
        <ContextMenu ItemsSource="{Binding Items}" />
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <ei:ChangePropertyAction TargetObject="{Binding ContextMenu, ElementName=addButton}" PropertyName="PlacementTarget" Value="{Binding ElementName=addButton, Mode=OneWay}"/>
                <ei:ChangePropertyAction TargetObject="{Binding ContextMenu, ElementName=addButton}" PropertyName="IsOpen" Value="True"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button.ContextMenu>
</Button>
于 2011-02-07T02:43:23.310 に答える
3

関数 Image_MouseDown にコードを追加するだけです

e.Handled = true;

それなら消えません。

于 2012-10-17T07:08:28.790 に答える
1

ここで見つけられなかった解決策を探して同じ問題に遭遇しました。

私はMVVMについて何も知らないので、おそらくMVVM準拠ではありませんが、うまくいきました。

ステップ 1: コンテキスト メニューに名前を付けます。

<Button.ContextMenu>
    <ContextMenu Name="cmTabs"/>
</Button.ContextMenu>

ステップ 2: コントロール オブジェクトをダブルクリックして、このコードを挿入します。順番大事!

Private Sub Button_Click_1(sender As Object, e As Windows.RoutedEventArgs)
        cmTabs.StaysOpen = True
        cmTabs.IsOpen = True
    End Sub

ステップ 3: 楽しむ

これは左右のクリックに反応します。これは、ControlTemplate を持つ ImageBrush を持つボタンです。

于 2016-08-01T12:07:09.800 に答える
0

contextMenu の Isopen プロパティを、「IsContextMenuOpen」のようなビューモデルのプロパティにバインドできます。しかし、問題は、contextmenu を viewModel に直接バインドできないことです。これは、userControl 階層の一部ではないためです。これを解決するには、タグ プロパティをビューの dataontext にバインドする必要があります。

<Image Tag="{Binding DataContext, ElementName=YourUserControlName}">
<ContextMenu IsOpen="{Binding PlacementTarget.Tag.IsContextMenuOpen,Mode=OneWay}" >
.....
</ContextMenu>
<Image>

幸運を。

于 2014-01-27T20:11:45.827 に答える
-1

XAML

    <Button x:Name="b" Content="button"  Click="b_Click" >
        <Button.ContextMenu >
            <ContextMenu   >
                <MenuItem Header="Open" Command="{Binding OnOpen}" ></MenuItem>
                <MenuItem Header="Close" Command="{Binding OnClose}"></MenuItem>                    
            </ContextMenu>
        </Button.ContextMenu>
    </Button>

C#

    private void be_Click(object sender, RoutedEventArgs e)
        {
        b.ContextMenu.DataContext = b.DataContext;
        b.ContextMenu.IsOpen = true;            
        }
于 2015-05-20T05:52:32.437 に答える