2015-04-01 174 views
0

我有一個畫布,當用戶右鍵單擊它時,會出現一個上下文菜單。我也有一個複選框,當選中該框時,我不想顯示上下文菜單。原因在於,當複選框被選中時,用戶的前兩次右擊將在右鍵點擊兩個點時丟棄省略號。現在,上下文菜單將彈出這兩個右鍵單擊。這裏是相對碼:禁止在畫布上右鍵單擊上下文菜單

<Window x:Class="Testproj.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Testproj" 
    xmlns:localConverters="clr-namespace:Testproj" 
    x:Name="this" 
    Height="650" Width="1091" 
    Loaded="this_Loaded" 
    Closing="this_Closing"> 

    <Window.Resources> 
     <local:BoolToVisibilityConverter x:Key="converter"/> 
    </Window.Resources> 

<Grid Height="Auto"> 
    <Grid.Resources> 
     <local:NullToVisibilityConverter x:Key="nullToVisibilityConverter" /> 
    </Grid.Resources> 

    <Grid VerticalAlignment="Top"> 
     <DockPanel> 
       <CheckBox x:Name="scaleBox" Content="Scale" IsChecked="False" Checked="scaleischecked"/> 
      </Menu> 
     </DockPanel> 
    </Grid> 

    <Viewbox Margin="0,23,0,157" x:Name="viewbox1" ClipToBounds="True"> 
     <Canvas Margin="0,21,0,12" x:Name="canvas1" ClipToBounds="True" RenderOptions.BitmapScalingMode="HighQuality" MouseWheel="Canvas_Zoom" MouseRightButtonDown="get_MousePosition" HorizontalAlignment="Left" Width="3138" Height="1260"> 
      <Canvas.RenderTransform> 
       <MatrixTransform x:Name="mt"/> 
      </Canvas.RenderTransform> 
      <Canvas.ContextMenu> 
       <ContextMenu Name="nodeContextMenu" Visibility="{StaticResource converter}" > 
        <MenuItem x:Name="test1" IsCheckable="False" Header="test1" Click="WaypointMenuItem_Click" > 
        </MenuItem> 
        <MenuItem x:Name="test2" IsCheckable="False" Header="test2" Click="KnownObjectMenuItem_Click" > 
        </MenuItem> 
       </ContextMenu> 
      </Canvas.ContextMenu> 
     </Canvas> 
    </Viewbox> 
</Grid> 
</Window> 

後面的代碼中右鍵單擊畫布:

private void get_MousePosition(object sender, MouseButtonEventArgs e) 
    { 
     if (scaleBox.IsChecked == true) 
     { 
      get_points(sender, e); 
     } 
    } 

我一直試圖與上下文菜單的IsOpen屬性亂搞,但它無論其設置爲true還是false,都可以右鍵單擊打開。

嘗試下面的轉換器。如果這是正確的,那麼使用這個綁定複選框和上下文菜單的正確方法是什麼?

namespace Testproj 
{ 
public class BoolToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Visibility visibility = Visibility.Collapsed; 
     if (value != null) 
     { 
      visibility = (bool)value ? Visibility.Collapsed : Visibility.Visible; 
     } 

     return visibility; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
} 

回答

1

我會實現一個或ValueConverterMultiValueConverter,然後使用轉換器來決定的狀態結合於複選框文本菜單(即啓用/禁用)。

 <Canvas.ContextMenu> 
      <ContextMenu Name="contextmenu1" Visibility="{Binding ElementName=scaleBox, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}" > 
       <MenuItem x:Name="item1" IsCheckable="False" Header="item2" /> 
       <MenuItem x:Name="item2" IsCheckable="False" Header="item1" /> 
      </ContextMenu> 
+0

不太確定轉換器是如何工作的,但我明白你的意思。有沒有其他的方式來綁定複選框的上下文菜單?我以前從未使用過轉換器。 – pfinferno 2015-04-01 13:17:31

+0

你需要學習。否則,如果您不利用XAML模式,您會像XAML開發人員一樣掙扎。 – 2015-04-01 13:27:07

+0

將嘗試編輯我的答案。你能否告訴我,如果這是正確的方式? – pfinferno 2015-04-01 13:35:16

0

這裏的路上,我想通了,如何做到這一點,因爲我不能得到轉換器正常工作:

的ContextMenuService.IsEnabled屬性設置爲畫布假。然後,在後面的代碼中,當未選中scalebox時,設置nodeContextMenu.IsOpen = true。這似乎有伎倆。

<Canvas Margin="0,21,0,12" x:Name="canvas1" ContextMenuService.IsEnabled="False" /> 

if (scaleBox.IsChecked == true) 
{ 
    get_Scaling(sender, e); 
} 
else 
{ 
    nodeContextMenu.IsOpen = true; 
} 
相關問題