1

我需要创建一个自定义下拉菜单,该下拉菜单有一个打开它的按钮和一个显示某些内容的面板,我希望在单击它外部时关闭它,我应该使用哪种面板?我尝试了 popupmenu 但在失去焦点后无法关闭它,并尝试了 contextmenu 但单击它的内部项目时它会关闭。

任何建议都将不胜感激。

我试过这样的事情:

    <Button x:Name="toggleButton"  
            ContextMenuService.Placement="Top"  Click="ToggleButton_Click"
            Margin="0" Content="+">
        <Button.ContextMenu>
            <ContextMenu Width="200" 
                         HorizontalContentAlignment="Stretch"
                         VerticalContentAlignment="Stretch" >
                <StackPanel>
                    <DataGrid >
                        <DataGrid.Columns>
                            <DataGridTextColumn/>
                            <DataGridTextColumn/>
                        </DataGrid.Columns>
                    </DataGrid>
                    <TextBlock Text="sadfasdfas" />
                    <TextBox Text="" Width="100"/>
                </StackPanel>
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
4

2 回答 2

2

你应该使用一个Popup控件。 是 MSDN 文档,这里是帮助指明方向的文章

于 2012-04-30T04:23:51.633 回答
1

最后我在 2 天后创建了我需要的东西!!,我真的找不到更好的解决方案,我不得不放两个按钮,一个用于显示弹出窗口,另一个用于关闭弹出窗口!

在xml中

    <ToggleButton x:Name="ShowPopup" Width="20" Height="20" Click="buttonShowPopup_Click"  Panel.ZIndex="1" />
    <ToggleButton x:Name="ClosePopup" Width="20" Height="20" Click="ClosePopupPopup_Click"  />
    <Popup x:Name="popup" 
        HorizontalOffset="0"
        VerticalOffset="0"
        PlacementTarget="{Binding ElementName=buttonShowPopup}"
        Placement="Top"
        PopupAnimation="Slide"
        AllowsTransparency="True"
        Focusable="True"

        StaysOpen="False" Margin="36,0,-36,0">
        <Grid LostFocus="Grid_LostFocus" >
            <TextBox Text="asdasd"/>
        </Grid>
    </Popup>

在代码隐藏中

 public DropDown()
    {
        InitializeComponent();
        popup.Closed += popup_Closed;
    }

    private void ClosePopupPopup_Click(object sender, RoutedEventArgs e)
    {
        popup.IsOpen = false;
    }
    private void buttonShowPopup_Click(object sender, RoutedEventArgs e)
    {
        popup.IsOpen = true;
        ClosePopup.SetValue(Canvas.ZIndexProperty, 1);
        ShowPopup.SetValue(Canvas.ZIndexProperty, 0);
    }

    void popup_Closed(object sender, EventArgs e)
    {
        ShowPopup.SetValue(Canvas.ZIndexProperty, 1);
        ClosePopup.SetValue(Canvas.ZIndexProperty, 0);
    }
于 2012-04-30T07:39:37.417 回答