2014-07-19 16 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

即使它在一個單獨的可視化樹中,該樹是否被添加到某個公共容器?如果你可以做一個簡單的例子來重複你的問題,這將更容易得出答案。 –

相關問題