none
Popup能做成多级菜单吗? RRS feed

  • 问题


  •  <Grid>
        <Popup x:Name="btn4Pop"  PopupAnimation="Scroll"  Width="230" Height="300" PlacementTarget="{Binding ElementName=btn4}" Placement="Right"  AllowsTransparency="True" StaysOpen="False">
            <Border Background="Transparent"  CornerRadius="5"   BorderBrush="#FF000000" BorderThickness="0">            
                    <StackPanel  Margin="10,30,0,0" >
                        <Button x:Name="btna" Content="aaa" Click="btna1_Click"   Margin="0,0,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                        <Button x:Name="btnb" Content="bbb"  Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                        <Button x:Name="btnc" Content="ccc"   Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />                    
                    </StackPanel>            
            </Border>
        </Popup>
            <Popup x:Name="btnaPop"  PopupAnimation="Slide"  Width="230" Height="300" PlacementTarget="{Binding ElementName=btna}" Placement="Right"  AllowsTransparency="True" StaysOpen="False">
                <Border Background="Transparent"  CornerRadius="5"   BorderBrush="#FF000000" BorderThickness="0">
                    <StackPanel  Margin="10,30,0,0" >
                        <Button x:Name="btna1" Content="a1" Click="btna1_Click_1"  Margin="0,0,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                        <Button x:Name="btna2" Content="b2"  Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                        <Button x:Name="btna3" Content="c3"   Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                    </StackPanel>
                </Border>
            </Popup>
            <Button x:Name="btn4" Width="100" Height="30" Content="Popup" Click="btn4_Click" Margin="12,76,366,155" />
            
        </Grid>
     

    按钮a1不能执行点击事件,为什么?而且点a1 a2 a3程序就会卡一会,在从新点Popup,最后那个Popup不显示啦


    • 已编辑 WCF小Q 2012年5月26日 13:54
    2012年5月26日 13:52

答案

  • Menu或者ContextMenu本来就是Popup的子类,所以完全是可以做的,或者你就用ContextMenu来实现。

    -----------------------------------

    言归正传,这个问题是因为Popup的可视树是独立的 (http://msdn.microsoft.com/en-us/library/ms749018.aspx#PopupandtheVisualTree),而且Popup显示后,她所在的可视树以及隐藏的Window会捕获输入和焦点,导致其他独立Popup和Window/控件无法点击,但是如果你将子Popup放入一个Popup中,就如同你将Popup放入Window,则问题可以解决:

      <Grid>
        <Popup x:Name="btn4Pop"  PopupAnimation="Scroll"  Width="230" Height="300" PlacementTarget="{Binding ElementName=btn4}" Placement="Right"  AllowsTransparency="True" StaysOpen="False">
          <Border Background="Transparent"  CornerRadius="5"   BorderBrush="#FF000000" BorderThickness="0">
            <StackPanel  Margin="10,30,0,0" >
              <Button x:Name="btna" Content="aaa" Click="btna_Click"   Margin="0,0,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
              <Button x:Name="btnb" Content="bbb"  Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
              <Button x:Name="btnc" Content="ccc"   Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
    
              <Popup x:Name="btnaPop"  PopupAnimation="Slide"  Width="230" Height="300" PlacementTarget="{Binding ElementName=btna" Placement="Right"  AllowsTransparency="True" StaysOpen="False">
                <Border Background="Transparent"  CornerRadius="5"   BorderBrush="#FF000000" BorderThickness="0">
                  <StackPanel  Margin="10,30,0,0" >
                    <Button x:Name="btna1" Content="a1" Click="btna1_Click"  Margin="0,0,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                    <Button x:Name="btna2" Content="b2"  Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                    <Button x:Name="btna3" Content="c3"   Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                  </StackPanel>
                </Border>
              </Popup>
            </StackPanel>
          </Border>
    
        </Popup>
        <Button x:Name="btn4" Width="100" Height="30" Content="Popup" Click="btn4_Click" Margin="12,76,366,155" />
    
      </Grid>


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 WCF小Q 2012年5月28日 5:45
    2012年5月28日 4:00
    版主

全部回复

  • Menu或者ContextMenu本来就是Popup的子类,所以完全是可以做的,或者你就用ContextMenu来实现。

    -----------------------------------

    言归正传,这个问题是因为Popup的可视树是独立的 (http://msdn.microsoft.com/en-us/library/ms749018.aspx#PopupandtheVisualTree),而且Popup显示后,她所在的可视树以及隐藏的Window会捕获输入和焦点,导致其他独立Popup和Window/控件无法点击,但是如果你将子Popup放入一个Popup中,就如同你将Popup放入Window,则问题可以解决:

      <Grid>
        <Popup x:Name="btn4Pop"  PopupAnimation="Scroll"  Width="230" Height="300" PlacementTarget="{Binding ElementName=btn4}" Placement="Right"  AllowsTransparency="True" StaysOpen="False">
          <Border Background="Transparent"  CornerRadius="5"   BorderBrush="#FF000000" BorderThickness="0">
            <StackPanel  Margin="10,30,0,0" >
              <Button x:Name="btna" Content="aaa" Click="btna_Click"   Margin="0,0,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
              <Button x:Name="btnb" Content="bbb"  Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
              <Button x:Name="btnc" Content="ccc"   Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
    
              <Popup x:Name="btnaPop"  PopupAnimation="Slide"  Width="230" Height="300" PlacementTarget="{Binding ElementName=btna" Placement="Right"  AllowsTransparency="True" StaysOpen="False">
                <Border Background="Transparent"  CornerRadius="5"   BorderBrush="#FF000000" BorderThickness="0">
                  <StackPanel  Margin="10,30,0,0" >
                    <Button x:Name="btna1" Content="a1" Click="btna1_Click"  Margin="0,0,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                    <Button x:Name="btna2" Content="b2"  Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                    <Button x:Name="btna3" Content="c3"   Margin="0,20,0,0" VerticalAlignment="Top"  Width="160" Height="50" />
                  </StackPanel>
                </Border>
              </Popup>
            </StackPanel>
          </Border>
    
        </Popup>
        <Button x:Name="btn4" Width="100" Height="30" Content="Popup" Click="btn4_Click" Margin="12,76,366,155" />
    
      </Grid>


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 WCF小Q 2012年5月28日 5:45
    2012年5月28日 4:00
    版主
  • Bob 谢谢~~~搞定!折磨我2天啦

    顺便问个别的

    Process myProcess;

    rocess.Start("D:\\a.exe ");

    我是想点击button2,如果a.exe是运行的,就结束进程。如果没启动,就开启。

     private void button2_Click(object sender, RoutedEventArgs e)
            {

    ???           if(!myProcess.HasExited) //???
               {

             }        }


    • 已编辑 WCF小Q 2012年5月28日 5:46
    2012年5月28日 5:45
  • 不能这么判断,你应该去看进程列表,获得当前系统的所有进程,然后看是否有你的a.exe 如果觉得通过名字来确定不是很精确,那么我们可以用一些其他的方式比如 互斥对象 Mutex

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月28日 8:04
    版主