none
求专家帮忙 控件模板中 POPUP 控件如何自动关闭 RRS feed

  • 问题

  • 创建了一个类似ComboBox自定义控件

    WPF的控件模板中创建的 Popup控件, 发现它不会自动关闭
    即使设置了属性 StaysOpen = false 鼠标或者键盘点击其它地方时,
    也不会自动关闭

    如果不是在控件模板中创建的  Popup控件
    只要设置了 属性 StaysOpen = false 鼠标或者键盘点击其它地方时,
    它就会自动关闭

    请问在控件模板中, 如何让这个 POPUP控件自动关闭
    如同ComboBox 中的弹出效果

    看了一天的combobox控件源码, 尤其它使用了很多没有公开的对象和方法, 看1天都没有看出问题在哪

     

     

    2011年4月2日 2:05

答案

  • 你好 IT农夫 ,

    据我所知,Popup在打开的时候会调用Mouse.Capture方法来捕获鼠标。这样,在以后的鼠标事件中,Popup会判断点击是否直接发生在自己的范围内。如果不是,并且StayOpen值为False,那么Popup就会关闭。

    而ComboBox也是做了类似的操作。ComboBox也是调用Mouse.Capture方法从Popup手中再次把鼠标捕获过来,这样Popup就不会自行关闭了。然后ComboBox依然会做和Popup类似的判断,并且在点击发生在其他界面元素上的时候,通过改变IsDropDownOpen的值来关闭Popup.

    希望这对你有帮助。

    如果这仍然不能解决你的问题,你是否能发给我们一个简单的示例。Popup控件即使在控件模板中,应该也不影响它关闭的逻辑。所以很可能是其他的一些代码,比如这个控件模板对应的控件造成了这个现象。如果你能够提供更多的信息,比如说提供一个能够充分地重现问题的小例子,可以让我们更好的帮助你找出问题所在。


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月4日 9:28
    版主

全部回复

  • 我是这么写的,不知道对你是否有用

    <UserControl x:Class="CommonControls.CCDateTime"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wf="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
      
         Width="80" Height="20"    x:Name="main"    >
        <Canvas  >
            <Button  Width="{Binding ElementName=main,Path=Width}" Height="{Binding ElementName=main,Path=Height}"
                     Name="btnDate"  Background="White" BorderBrush="Black" BorderThickness="1" >
              
            </Button>
          
            <Popup x:Name="popUp"   StaysOpen="False" Placement="Bottom"  
                   PlacementTarget="{Binding ElementName=tbDate}"   AllowsTransparency="True"   >
                <wf:Calendar x:Name="calendar"     Background="White"  >
                </wf:Calendar>
            </Popup>

        </Canvas>
    </UserControl>

    2011年4月2日 2:28
  • 你这里是在控件的正常布局中创建的Popup控件, 所以它会正常发挥作用

    如果是在控件模板中创建的控件, 比如类似ComboBox的控件模板中创建的如下

    <ControlTemplate>
      <Grid >

    ...

        <Popup ....  StaysOpen="False" AllowsTransparency="True"  >

        ...

        </popup>

      </Grid>

    <ControlTemplate>       

    就会发现 Popup 控件在打开后 不会自动关闭

    但是Combobox控件会自动正常关闭这个控件

    所以想了解它的实现原理

     

     

    2011年4月2日 3:06
  • ComboBox里的PopUp控件绑定到了ComboBox本身的IsDropDownOpen属性, 行为比较复杂..

    我建议LZ可以再每次PopUp弹出的时候给MainWindow附加一个MouseUp 事件.. 鼠标点击Window任何地方 只要不是PopUp控件或者你不想点击关闭PopUp的控件,检查StaysOpen属性, False的话就关闭PopUp控件..  记得移除MouseUp事件..


    just another day.
    2011年4月2日 11:33
  • 你好 IT农夫 ,

    据我所知,Popup在打开的时候会调用Mouse.Capture方法来捕获鼠标。这样,在以后的鼠标事件中,Popup会判断点击是否直接发生在自己的范围内。如果不是,并且StayOpen值为False,那么Popup就会关闭。

    而ComboBox也是做了类似的操作。ComboBox也是调用Mouse.Capture方法从Popup手中再次把鼠标捕获过来,这样Popup就不会自行关闭了。然后ComboBox依然会做和Popup类似的判断,并且在点击发生在其他界面元素上的时候,通过改变IsDropDownOpen的值来关闭Popup.

    希望这对你有帮助。

    如果这仍然不能解决你的问题,你是否能发给我们一个简单的示例。Popup控件即使在控件模板中,应该也不影响它关闭的逻辑。所以很可能是其他的一些代码,比如这个控件模板对应的控件造成了这个现象。如果你能够提供更多的信息,比如说提供一个能够充分地重现问题的小例子,可以让我们更好的帮助你找出问题所在。


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月4日 9:28
    版主
  • 谢谢min Zhu

    今天登录才看到你的答复, 了解了ComboBox控件关闭 Popup的基本原理

    谢谢

    2011年4月7日 11:04