私は WPF アプリケーションを持っています..Xaml ファイルに Image コントロールがあります。
この画像を右クリックすると、コンテキスト メニューが表示されます。
「左クリック」でも同じように表示させたいです。
MVVM の方法でこれを行うにはどうすればよいですか?
私は WPF アプリケーションを持っています..Xaml ファイルに Image コントロールがあります。
この画像を右クリックすると、コンテキスト メニューが表示されます。
「左クリック」でも同じように表示させたいです。
MVVM の方法でこれを行うにはどうすればよいですか?
このような 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;
}
}
コードビハインドを使用せずに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>
関数 Image_MouseDown にコードを追加するだけです
e.Handled = true;
それなら消えません。
ここで見つけられなかった解決策を探して同じ問題に遭遇しました。
私は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 を持つボタンです。
contextMenu の Isopen プロパティを、「IsContextMenuOpen」のようなビューモデルのプロパティにバインドできます。しかし、問題は、contextmenu を viewModel に直接バインドできないことです。これは、userControl 階層の一部ではないためです。これを解決するには、タグ プロパティをビューの dataontext にバインドする必要があります。
<Image Tag="{Binding DataContext, ElementName=YourUserControlName}">
<ContextMenu IsOpen="{Binding PlacementTarget.Tag.IsContextMenuOpen,Mode=OneWay}" >
.....
</ContextMenu>
<Image>
幸運を。
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;
}