2016-11-25 31 views
0

私はカスタマイズされたMenuとMenuItemを持っており、各MenuItemには特定のコマンドがバインドされています。私の問題は、MenuItemをクリックすると、コマンドは実行されますが、メニューは閉じられないということです。ここでWPFでバインドされたコマンドでMenuItemをクリックした後にメニューが閉じない

一つのMenuItem

<Menu Background="#f4f4f4" x:Name="ExportMenu"> 
<Menu.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Vertical" Background="#f4f4f4"/> 
    </ItemsPanelTemplate> 
</Menu.ItemsPanel> 
    <MenuItem x:Name="CopyItem" Header="Copy" Style="{DynamicResource MainMenuItem}" 
       CommandParameter="{Binding Data.CurrentPlotVMs, Source={StaticResource Proxy}}" 
       Command="{Binding Data.ExporterVM.CopyGraphicPlotsCommand, Source={StaticResource Proxy}}" Click="CopyItem_Click"> 
    <MenuItem.Icon> 
     <TextBlock Text="" FontSize="15" FontFamily="../Icons/#icons"/> 
    </MenuItem.Icon> 
</MenuItem> 
</Menu> 

とメニューの一例だと、ここでたぶん私は間違ったプロパティを設定したり、間違った何かをやっている私のカスタマイズされたスタイル

<Style x:Key="MainMenuItem" TargetType="{x:Type MenuItem}"> 
<Setter Property="OverridesDefaultStyle" Value="True"/> 
<Setter Property="FontFamily" Value="Open Sans"/> 
<Setter Property="FontSize" Value="12"/> 
<Setter Property="Foreground" Value="Black"/> 
<Setter Property="FontWeight" Value="Light"/> 
<Setter Property="StaysOpenOnClick" Value="False"/> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type MenuItem}"> 
      <Border x:Name="templateRoot" BorderThickness="0" Background="#f4f4f4" SnapsToDevicePixels="True" Padding="0,10,10,10"> 
       <Grid VerticalAlignment="Center"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="Auto"/> 
        </Grid.ColumnDefinitions> 
        <ContentPresenter x:Name="Icon" 
             Grid.Column="0" 
             Content="{TemplateBinding Icon}" 
             ContentSource="Icon" 
             HorizontalAlignment="Center" Height="16" Width="16" 
             Margin="5,0,5,0" 
             SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
             VerticalAlignment="Center"/> 
        <ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" 
             Content="{TemplateBinding Header}" 
             Grid.Column="1" 
             ContentStringFormat="{TemplateBinding HeaderStringFormat}" 
             ContentSource="Header" 
             Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </Grid> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsMouseOver" Value="true"> 
        <Setter TargetName="templateRoot" Property="Background" Value="{StaticResource ResourceKey=FrSkyBlue}"/> 
        <Setter Property="Foreground" Value="{StaticResource FrWhite}"/> 
        <Setter Property="Cursor" Value="Hand"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

だ、私はちょっとねWPFとMVVMの新機能です。

あなたは同じボタン/コントロールのため Click eventCommandを使用することはできません
+1

'何をCopyItem_Click'ん?なぜあなたはコマンドとクリックハンドラが必要なのですか? – Haukinger

+0

アイコンの表示を変更するだけで、メニューにはクリックされた項目によってアイコンが変化します。各アイテムには、自分のプロジェクトに必要なアクションを実行するコマンドバインドがあります。このクリックイベントは、ビュー内のアイコンの可視性を処理していました。 –

答えて

0

:私はあなたがメニューを閉じているCopyItem_Click()方法であることを前提と

- あなたが決定する必要がありますあなたがMVVMモデルを使用している場合、またはこれはこのパターンのない単純なXAMLアプリケーションです。これはsimplierバージョンである場合

、あなたはClickメソッドでこれを扱うことができます:ケースのために他のaproachはMVVMモデルを使用している

private void CopyItem_Click(object sender, ...) 
{ 
    var cmd = CopyItem.Command; 
    var param = CopyItem.CommandParameter; 

    if(cmd != null && cmd.CanExecute(param)) 
     cmd.Execute(param); 

    // add the code for closing menu 
} 

Clickイベント処理の使用を完全に避け、代わりにこれをコマンドでプッシュする必要があります。コマンド自体は作業を行い、後はメニューを閉じる必要があります。

public RelayCommand MyCommand 
{ 
    get; 
    private set; 
} 

public MainViewModel() 
{ 
    MyCommand = new RelayCommand(ExecuteMyCommand); 
} 

private void ExecuteMyCommand() 
{ 
    // Do the work You expect 

    // Close the menu 
} 

一部SRC:

+1

明確化のおかげで、私はCopyItem_Clickのメニューを閉じていませんでした。私はビュー内のアイコンの可視性を変更していました。しかし、MVVMを使用している場合は、コマンドとClickイベントを同時に行うことができないので、アイコンの可視性を扱う別の方法を管理する必要があります。 –

関連する問題