2012-12-23 31 views
5

Tôi đã tạo một menu ngữ cảnh tùy chỉnh, nơi tôi đã thay đổi diện mạo của tất cả các mục. Các mục này chứa các điều khiển khác nhau như combobox và nút. Bây giờ tôi muốn trình đơn đóng nếu một nút được nhấn hoặc một mục combobox đã được chọn. Hiện tại, menu vẫn mở. Bạn có thể cho tôi gợi ý không?Đóng ContextMenu với Menu Templated

Đây là một mã đơn giản để hiển thị những gì tôi đã làm:

<ContextMenu StaysOpen="False"> 
    <MenuItem> 
     <MenuItem.Template> 
      <ControlTemplate> 
       <Grid MinWidth="200"> 
        <Button Command="{Binding SomeWorkingCommandBinding}">OK</Button> 
       </Grid> 
      </ControlTemplate> 
     </MenuItem.Template> 
    </MenuItem> 
</ContextMenu> 

Như đã đề cập, tôi muốn đóng menu khi tôi nhấn nút đó OK.

CẬP NHẬT

Các nút sau (hoặc bất kỳ điều khiển khác) hiện các trick mà không cần Blend SDK:

<Button.Triggers> 
    <EventTrigger RoutedEvent="Button.Click"> 
     <BeginStoryboard> 
      <Storyboard> 
       <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(ContextMenu.IsOpen)" Storyboard.Target="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}"> 
        <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
         <DiscreteObjectKeyFrame.Value> 
          <sys:Boolean>False</sys:Boolean> 
         </DiscreteObjectKeyFrame.Value> 
        </DiscreteObjectKeyFrame> 
       </ObjectAnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</Button.Triggers> 

Trả lời

3

Sử dụng ChangePropertyAction mà là một phần của Blend SDK để thay đổi IsOpen tài sản của ContextMenu ngay khi Nút được nhấp:

<ContextMenu x:Name="MyContextMenu"> 
    <MenuItem> 
    <MenuItem.Template> 
     <ControlTemplate> 
      <Grid MinWidth="200"> 
       <Button Command="{Binding SomeWorkingCommandBinding}" Content="OK"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="Click"> 
          <ei:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}" PropertyName="IsOpen" Value="False"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </Button> 
      </Grid> 
     </ControlTemplate> 
    </MenuItem.Template> 
    </MenuItem> 
</ContextMenu> 

Bạn sẽ cần các không gian tên sau đây:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"     
xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
+0

Tôi thích ý tưởng, tuy nhiên mẫu của bạn không hoạt động kể từ khi TargetObject không thể là một ElementName ngoài ControlTemplate, vì vậy tôi sử dụng một RelativeSource cho điều đó. Tuy nhiên tôi đã thêm một giải pháp không có Blend vào bài viết đầu tiên của tôi. – Jaster

+0

Đúng - Cập nhật câu trả lời với RelativeSource (để tham khảo sau này ...) – Blachshma

Các vấn đề liên quan