Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf ContextMenu StaysOpen不工作_Wpf - Fatal编程技术网

Wpf ContextMenu StaysOpen不工作

Wpf ContextMenu StaysOpen不工作,wpf,Wpf,我在ContextMenu内显示UserControl。此外,在UserControl中,我显示了一个弹出窗口,其中包含一些按钮和数据网格。运行时加载弹出窗口中的所有数据 问题是ContextMenu忽略属性StaysOpen,即使该属性设置为true 当我在代码隐藏中将StaysOpen设置为true时,弹出窗口保持打开状态,但是ContextMenu没有 我使用以下代码进行了尝试: <UserControl x:Class="UserControl" xmlns="h

我在
ContextMenu
内显示
UserControl
。此外,在
UserControl
中,我显示了一个
弹出窗口
,其中包含一些按钮和数据网格。运行时加载
弹出窗口中的所有数据

问题是
ContextMenu
忽略属性
StaysOpen
,即使该属性设置为
true

当我在代码隐藏中将
StaysOpen
设置为
true
时,
弹出窗口保持打开状态,但是
ContextMenu
没有

我使用以下代码进行了尝试:

<UserControl x:Class="UserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Grid>
   <Popup Name="popupState" PlacementTarget="{Binding ElementName=txtSearch}" PopupAnimation="Slide" Placement="Bottom" Focusable="True" AllowsTransparency="True" VerticalAlignment="Top">

   <Button HorizontalAlignment="Right" Margin="5" Background="GhostWhite" Name="btnSelectAll" Click="btnSelectAll_Click" Width="30" Height="30">

   <my:DataGrid VerticalAlignment="Stretch" MaxHeight="300" VerticalScrollBarVisibility="Auto" RowHeaderWidth="0" Margin="5,5,5,1" Background="White" HorizontalAlignment="Stretch" Name="DGTeamCommunicator" HorizontalContentAlignment="Left" HorizontalGridLinesBrush="#D6D7D6" GridLinesVisibility="None">
      <my:DataGridTemplateColumn  Width="Auto" MinWidth="30">
         <my:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
               <StackPanel Orientation="Horizontal" ContextMenuService.IsEnabled="True" ContextMenuService.HasDropShadow="True">
                  <Button Name="btnCall"  Click="btnCall_Click" ContextMenuService.IsEnabled="True">
                  </Button>
               </StackPanel>
           </DataTemplate>
        </my:DataGridTemplateColumn.CellTemplate>
      </my:DataGridTemplateColumn>
   </my:DataGrid>
</Popup>

我的要求是,当单击
弹出窗口中的按钮时,防止
弹出窗口
以及
上下文菜单
关闭


请为我提供一个解决方案。

坏消息是这种行为是故意的。ContextMenu定义为显示几个菜单,当单击其中一个菜单时,ContextMenu会在内部将IsOpen设置为false

好消息是,行为应该保持不变,对于任何其他定制,您应该使用弹出窗口而不是上下文菜单。但如果出于任何原因必须使用ContextMenu,这里有一个解决方法:

<StackPanel>
    <Button>
        Popup Demo
        <Button.ContextMenu>
            <local:StaysOpenContextMenu x:Name="ContextMenu1" StaysOpen="True">
                <StackPanel>
                    <TextBox x:Name="TextBox1" Width="100" TextChanged="OnTextChanged"/>
                    <Popup x:Name="Popup1" Placement="Bottom" PlacementTarget="{Binding ElementName=tbx}" StaysOpen="True">
                        <Button Content="click me"/>
                    </Popup>
                </StackPanel>
            </local:StaysOpenContextMenu>
        </Button.ContextMenu>
    </Button>
    <Button Click="OnClick">Close Popup</Button>
</StackPanel>

请为您的时间发布更多代码,dev hedgehog,我更新了代码片段。看一看,给我一个解决方案看一看我的答案:)我编辑了你的问题,让事情变得清晰易懂。我希望你不介意。顺便说一句,这里是+1从我的问题。这是一个好问题
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        this.Popup1.IsOpen = true;
    }

    private void OnClick(object sender, RoutedEventArgs e)
    {
        this.Popup1.IsOpen = false;
        this.ContextMenu1.CloseContextMenu();
    }
}

public class StaysOpenContextMenu : ContextMenu
{
    private bool mustStayOpen;

    static StaysOpenContextMenu()
    {
        IsOpenProperty.OverrideMetadata(
            typeof(StaysOpenContextMenu),
            new FrameworkPropertyMetadata(false, null, CoerceIsOpen));
        StaysOpenProperty.OverrideMetadata(
            typeof(StaysOpenContextMenu),
            new FrameworkPropertyMetadata(false, PropertyChanged, CoerceStaysOpen));
    }

    private static void PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        StaysOpenContextMenu menu = (StaysOpenContextMenu)d;
        menu.mustStayOpen = (bool)e.NewValue;
    }

    private static object CoerceStaysOpen(DependencyObject d, object basevalue)
    {
        d.CoerceValue(IsOpenProperty);
        return basevalue;
    }

    private static object CoerceIsOpen(DependencyObject d, object basevalue)
    {
        StaysOpenContextMenu menu = (StaysOpenContextMenu)d;
        if (menu.StaysOpen && menu.mustStayOpen)
        {
            return true;
        }

        return basevalue;
    }

    public void CloseContextMenu()
    {
        this.mustStayOpen = false;
        this.IsOpen = false;
    }
}