2014-07-19 17 views
1

我正在为一个kinect制作各种菜单界面,并且我正在尝试一个带menuitem控件的经典菜单;为了可视化光标,我使用了一个usercontrol handshaped(我需要它,我不能使用自定义光标)。我对儿童菜单项有问题,因为它们不是主窗口可视化树的一部分,但我管理它们。如何在C#中的menuItem上使用用户控件?

我无法修复的唯一问题是,当你打开一个菜单项时,他总是保持在其他界面元素的顶部,所以它也覆盖了我的手形“游标”,因为它不是一个真正的游标,而是仅仅是一个“可视化器”。

对于如何始终使用我的用户控件,或者更改menuitem的行为,您有一些建议吗?

我添加的图像显示效果更好的问题: (http://imgur.com/7XSAglV.jpeg

这是代码的摘录:(该pseudocursor在另一个定义在另一个文件中,并在画布上的程序添加)

<Window 
    .... 
    xmlns:local="clr-namespace:ProvaHover" 
    x:Class= "ProvaHover.MainWindow" 
    Cursor="None" 
    Title="MainWindow" WindowStyle = "None" WindowStartupLocation="CenterScreen" SizeToContent="Manual" WindowState="Maximized" HorizontalAlignment="Left" VerticalAlignment="Top" ResizeMode="NoResize" Closed="Window_Closed"> 
<Grid x:Name="gridParent"> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="200" Name="row" /> 
     <RowDefinition Height="2*" /> 
    </Grid.RowDefinitions> 

    <Border BorderBrush="#FFA0A0A0" BorderThickness="1"> 
     <Menu IsMainMenu="True" Grid.Row="0" Height="{Binding ElementName=row, Path=Height}" FontSize="140" VerticalAlignment="Top" local:MagneticPropertyHolder.IsMagnetic ="True" Grid.ZIndex ="2"> 



      <MenuItem Header="_File" Name="fileMenu" Background="Transparent" local:MagneticPropertyHolder.IsMagnetic ="True" SubmenuOpened="filemenuitem_SubmenuOpened" Grid.ZIndex="2"> 

       <MenuItem Header="_New... " local:MagneticPropertyHolder.IsMagnetic ="True" Name="newMenu" Loaded="newmenuitem_Loaded" > 
        <MenuItem Header="_New... " Grid.ZIndex="2" /> 
        <Separator /> 
       </MenuItem> 

       <MenuItem Header="_Open..." Name="openMenu" local:MagneticPropertyHolder.IsMagnetic ="True" Loaded="openMenu_Loaded" Grid.ZIndex="2" > 
        <MenuItem Header="_New... " Grid.ZIndex="2" /> 
       </MenuItem> 
       <Separator /> 


       <MenuItem Header="_Save" Name="saveMenu" local:MagneticPropertyHolder.IsMagnetic ="True" Loaded="savemenuitem_Loaded" Grid.ZIndex="2"/> 
       <MenuItem Header="_Save As..." Name="saveasMenu" local:MagneticPropertyHolder.IsMagnetic ="True" Loaded="saveasmenuitem_Loaded" Grid.ZIndex="2"/> 
       <Separator /> 

       <MenuItem Header="_Exit" Name="exitMenu" Click="MenuItem_Click" local:MagneticPropertyHolder.IsMagnetic ="True" Loaded="exitmenuitem_Loaded" Grid.ZIndex="2" /> 

      </MenuItem> 

      <StackPanel Grid.ZIndex="2"> 
       <Rectangle VerticalAlignment="Stretch" Width="1" Margin="4" Stroke="#FFA0A0A0" Height="180" Fill="#FFA0A0A0" /> 
      </StackPanel> 



     </Menu> 

    </Border> 



    <k:KinectSensorChooserUI HorizontalAlignment="Center" VerticalAlignment="Top" x:Name="sensorChooserUI"/> 


    <Canvas Grid.RowSpan="2" x:Name="mouseCanvas" Grid.ZIndex="10" > 

    </Canvas> 
</Grid> 

回答

0

您可以通过使用其父访问菜单项的z顺序。父级应该有一个名为控件的集合属性,您可以从中调用GetChildIndex和SetChildIndex方法。 希望这有助于。

+0

我搜索了一些关于这些2种方法,但似乎他们正在的WinForms,我忘了说我与WPF – kelevrax

+0

我怕我没有与WPF尽可能多的工作经验但我相信有az索引属性或类似的,你可以用在某个地方。对不起,我帮不了你。 – Alpar

+0

我将使用有关ZIndex的Mark的提示进行检查,无论如何我要感谢 – kelevrax

0

大多数你有可用的基于断Panel容器的容器对象,它有一个attached property称为ZIndexSetZIndexGetZIndex方法。

用法:

<Grid> 
    <Rectangle Name="Rect1" Grid.ZIndex="1" Fill="Red"/> 
    <Rectangle Name="Rect2" Grid.ZIndex ="2" Fill="blue"/> 
    <Button Grid.ZIndex ="3" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="207,225,0,0" Click="ButtonBase_OnClick"/> 
</Grid> 

这将设置在XAML中,你可以通过使用Grid.SetZIndexGrid.GetZIndex方法在你的代码中访问它背后的Z-索引。

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    if (Grid.GetZIndex(Rect1) == 1) 
    { 
     Grid.SetZIndex(Rect1, 2); 
    } 
    else 
    { 
     Grid.SetZIndex(Rect1, 1); 
    } 

    if (Grid.GetZIndex(Rect2) == 2) 
    { 
     Grid.SetZIndex(Rect2, 1); 
    } 
    else 
    { 
     Grid.SetZIndex(Rect2, 2); 
    } 
} 
+0

我发现了这个属性,但我并不真正了解它是如何工作的,因此请求解释。我会明天尝试,并让你知道,即使我怀疑这不起作用,因为第二级menuitem(弹出窗口中出现的那个)不是网格的子节点,它属于另一个视觉树 – kelevrax

+0

像我一样怀疑它不起作用 – kelevrax

+0

即使它在一个单独的可视化树中,该树是否被添加到某个公共容器?如果你可以做一个简单的例子来重复你的问题,这将更容易得出答案。 –

相关问题