none
header flyout RRS feed

  • 问题

  • 想做成这种效果的,但是找了一下combobox控件无法达到这种效果,求问这个是调用的神马控件啊?

     
    2012年8月9日 7:52

答案

  • XAML:

    <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        PointerPressed="Page_PointerPressed_1">
    
        <StackPanel Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button Content="Show Popup 1" Click="Button_Click_1"/>
            <Button Content="Show Popup 2" Click="Button_Click_2"/>
            <Button Content="Show Popup 3" Click="Button_Click_3"/>
            <Popup x:Name="popup1">
                <Grid Width="200" Height="200" Background="Gray">
                    <TextBlock Text="Popup 1" FontSize="30"/>
                </Grid>
            </Popup>
            <Popup x:Name="popup2">
                <Grid Width="200" Height="200" Background="Blue">
                    <TextBlock Text="Popup 2" FontSize="30"/>
                </Grid>
            </Popup>
        </StackPanel>
    </Page>
    

    C#:

        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
                PopupManager.RegisterPopup(popup1);
                PopupManager.RegisterPopup(popup2);
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                popup1.IsOpen = true;
                PopupManager.RegisterPopup(popup1);
                PopupManager.CloseOtherPopups(popup1);
            }
    
            private void Button_Click_2(object sender, RoutedEventArgs e)
            {
                popup2.IsOpen = true;
                PopupManager.RegisterPopup(popup2);
                PopupManager.CloseOtherPopups(popup2);
            }
    
            private void Button_Click_3(object sender, RoutedEventArgs e)
            {
                Popup popup3 = new Popup() { VerticalOffset = 200, HorizontalOffset = 200 };
                popup3.Child = new Grid() { Width = 300, Height = 200, Background = new SolidColorBrush(Colors.Red) };
                popup3.IsOpen = true;
                PopupManager.RegisterPopup(popup3);
                PopupManager.CloseOtherPopups(popup3);
            }
    
            private void Page_PointerPressed_1(object sender, PointerRoutedEventArgs e)
            {
                PopupManager.CloseOtherPopups(null);
            }
        }
    
        public class PopupManager
        {
            private static List<Popup> Popups = new List<Popup>();
            public static void RegisterPopup(Popup popup)
            {
                popup.Closed += (o, e) => { UnregisterPopup(o as Popup); };
                if (!Popups.Contains(popup)) Popups.Add(popup);
            }
            private static void UnregisterPopup(Popup popup)
            {
                if (Popups.Contains(popup)) Popups.Remove(popup);
            }
            public static void CloseOtherPopups(Popup popup)
            {
                foreach (Popup p in Popups)
                {
                    if (p.Equals(popup) == false && p.IsOpen == true)
                    {
                        p.IsOpen = false;
                    }
                }
            }
        }


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

    • 已标记为答案 lincolnxu 2012年8月14日 1:23
    2012年8月13日 9:04
    版主

全部回复

  • 难道只能自己写popup?
    2012年8月9日 8:05
  • HTML WinJS Flyout  控件,或者XAML中Popup实现。

    你可以自己创建一个ItemsControl的子类,设计类似如下的模板:

        <Style TargetType="local:CustomControl1">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:CustomControl1">
                        <Border
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="auto"/>
                                </Grid.ColumnDefinitions>
                                <ContentPresenter Content="{TemplateBinding Header}"/>
                                <Border Grid.Column="1">
                                    <Button Content="&#xE015;" FontFamily="Segoe UI Symbol"/>
                                </Border>
                                <Popup x:Name="POPUP_PART" IsOpen="False">
                                    <ItemsPresenter />
                                </Popup>
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>


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

    2012年8月10日 4:07
    版主
  • 我用popupmenu做了之后,发现是可用的,但是一旦进入了其它页面再跳转回来之后,popupmenu虽然可以点击出现,但是不能再捕捉鼠标指针和点击了。。。

    求问怎么解决啊?

    2012年8月10日 7:27
  • 额, 那么 你的代码是怎么样的?

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

    2012年8月10日 7:47
    版主
  • 额, 那么 你的代码是怎么样的?

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

    在mainpage(){

    dropmenu.Tapped += new TappedEventHandler(AttachmentImage_Tapped);

    }

    然后还有

            public static Rect GetElementRect(FrameworkElement element)
            {
                GeneralTransform buttonTransform = element.TransformToVisual(null);
                Point point = buttonTransform.TransformPoint(new Point());
                return new Rect(point, new Size(element.ActualWidth, element.ActualHeight));
            }

            private async void AttachmentImage_Tapped(object sender, TappedRoutedEventArgs e)
            {
                var menu = new PopupMenu();
                menu.Commands.Add(new UICommand("首页", (command) =>
                {

                }));
                menu.Commands.Add(new UICommand("第二页", (command) =>
                {
                    this.Frame.Navigate(typeof(Page2));


                }));

                await menu.ShowForSelectionAsync(GetElementRect((FrameworkElement)sender));

            }

    进入程序之后,这个好使,只要不离开首页,怎么都没问题,但是离开首页再回来,这个菜单可以点开和消失,但是已经不能点击上面的选项,感觉有点获取不到焦点的味道。

    2012年8月10日 8:03
  • 找到原因了,是我在首页设置了NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required;

    把这一句注释掉就正常了 

    但是怎么解决这二者的冲突呢?

    2012年8月10日 8:26
  • 没有啊,我测试你的代码 ,一切正常。你是否是GoBack回到 原来页面 ?获不到焦点 ? 那么检查下是否有其他控件阻止了你的Tap动作。

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

    2012年8月10日 8:30
    版主
  • 奇怪了,我这里也测试了 Required 的 CacheMode 也是好的。

    不过既然是你缓存了页面,那么 就要看一下是否缓存了你的dropmenu的状态和他周围控件的信息。 因为我的测试代码 很简单 ,就一个Rectangle 上进行 Tap测试。


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

    2012年8月10日 8:54
    版主
  • 还问一下,如果用popup实现,怎样使得popup出现之后点击其它任何地方popup就能消失呢?
    2012年8月10日 9:26
  • Popup本身没有这个行为,如果要实现,我建议通过一个管理类来管理所有你Open的Popup, 然后实现Pointer 点击其他地方来关闭所有的Popup

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

    2012年8月13日 5:48
    版主
  • 求samplecode啊 嘿嘿

    非常感谢:)

    2012年8月13日 7:34
  • XAML:

    <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        PointerPressed="Page_PointerPressed_1">
    
        <StackPanel Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button Content="Show Popup 1" Click="Button_Click_1"/>
            <Button Content="Show Popup 2" Click="Button_Click_2"/>
            <Button Content="Show Popup 3" Click="Button_Click_3"/>
            <Popup x:Name="popup1">
                <Grid Width="200" Height="200" Background="Gray">
                    <TextBlock Text="Popup 1" FontSize="30"/>
                </Grid>
            </Popup>
            <Popup x:Name="popup2">
                <Grid Width="200" Height="200" Background="Blue">
                    <TextBlock Text="Popup 2" FontSize="30"/>
                </Grid>
            </Popup>
        </StackPanel>
    </Page>
    

    C#:

        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
                PopupManager.RegisterPopup(popup1);
                PopupManager.RegisterPopup(popup2);
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                popup1.IsOpen = true;
                PopupManager.RegisterPopup(popup1);
                PopupManager.CloseOtherPopups(popup1);
            }
    
            private void Button_Click_2(object sender, RoutedEventArgs e)
            {
                popup2.IsOpen = true;
                PopupManager.RegisterPopup(popup2);
                PopupManager.CloseOtherPopups(popup2);
            }
    
            private void Button_Click_3(object sender, RoutedEventArgs e)
            {
                Popup popup3 = new Popup() { VerticalOffset = 200, HorizontalOffset = 200 };
                popup3.Child = new Grid() { Width = 300, Height = 200, Background = new SolidColorBrush(Colors.Red) };
                popup3.IsOpen = true;
                PopupManager.RegisterPopup(popup3);
                PopupManager.CloseOtherPopups(popup3);
            }
    
            private void Page_PointerPressed_1(object sender, PointerRoutedEventArgs e)
            {
                PopupManager.CloseOtherPopups(null);
            }
        }
    
        public class PopupManager
        {
            private static List<Popup> Popups = new List<Popup>();
            public static void RegisterPopup(Popup popup)
            {
                popup.Closed += (o, e) => { UnregisterPopup(o as Popup); };
                if (!Popups.Contains(popup)) Popups.Add(popup);
            }
            private static void UnregisterPopup(Popup popup)
            {
                if (Popups.Contains(popup)) Popups.Remove(popup);
            }
            public static void CloseOtherPopups(Popup popup)
            {
                foreach (Popup p in Popups)
                {
                    if (p.Equals(popup) == false && p.IsOpen == true)
                    {
                        p.IsOpen = false;
                    }
                }
            }
        }


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

    • 已标记为答案 lincolnxu 2012年8月14日 1:23
    2012年8月13日 9:04
    版主