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;
}
}