在我的Prism 6 WPF MVVM应用程序中,我使用以下PrismUserControl WPF来显示模态通知对话框:
<UserControl x:Class="CommonWpfControlLibrary.NotificationDialogPopupView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" MaxHeight="300" MaxWidth="600">
<StackPanel Orientation="Vertical" Margin="20">
<TextBlock Text="{Binding Message}" TextWrapping="Wrap"/>
<telerik:RadButton Content="OK" Command="{Binding OnOkPressedCommand}" HorizontalAlignment="Center" Width="50" Margin="0 10 0 0"/>
</StackPanel>
</UserControl>
在我使用此UserControl作为模态对话框内容的视图中,我将其定义如下:
<i:Interaction.Triggers>
<prism:InteractionRequestTrigger SourceObject="{Binding NotificationRequest, Mode=OneWay}">
<prism:PopupWindowAction IsModal="True" CenterOverAssociatedObject="True">
<prism:PopupWindowAction.WindowContent>
<commonControls:NotificationDialogPopupView/>
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
</i:Interaction.Triggers>
但正如您可以看到'最小化','最大化'和'关闭'按钮可见并启用。系统菜单(在对话框的左上角激活)也已启用。 如何隐藏“最小化”,“最大化”和“关闭”按钮并禁用系统菜单?
答案 0 :(得分:1)
@Evangelink很接近。您将使用WindowStyle属性,但您必须提供实际样式。类似的东西:
<Style TargetType="{Window}">
<Setter Property="" Value="" />
</Style>
答案 1 :(得分:1)
2.禁用关闭按钮:
未显示图标和关闭按钮:
不幸的是,WPF中没有此功能。为此,您可以尝试通过从Window类的SourceInitialized事件调用[Get / Set] WindowLong(pInvoking in Win32)来设置WS_EX_DLGMODALFRAME窗口样式。
检查一下:
public partial class MainWindow : Window
{
[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);
const uint MF_BYCOMMAND = 0x00000000;
const uint MF_GRAYED = 0x00000001;
const uint MF_ENABLED = 0x00000000;
const uint SC_CLOSE = 0xF060;
const int WM_SHOWWINDOW = 0x00000018;
const int WM_CLOSE = 0x10;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
if (hwndSource != null)
{
hwndSource.AddHook(new HwndSourceHook(this.hwndSourceHook));
}
}
IntPtr hwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_SHOWWINDOW)
{
IntPtr hMenu = GetSystemMenu(hwnd, false);
if (hMenu != IntPtr.Zero)
{
EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
}
}
else if (msg == WM_CLOSE)
{
handled = true;
}
return IntPtr.Zero;
}
}
答案 2 :(得分:0)
我现在没有任何工作示例,所以我可能会有一个不完整的答案。
通过查看Prism源代码PopupWindowAction,我可以看到一个WindowStyle
属性,您可以使用它来更改弹出窗口的样式。我想你要找的属性值是WindowStyle="ToolWindow"
。
希望它有所帮助!
答案 3 :(得分:0)
我找到了两个解决方案:
将Window.WindowStyle
属性设置为WindowStyle.None
予。禁用最小化,最大化按钮:
这可以通过将Window.ResizeMode
属性设置为ResizeMode.NoResize
来实现。它将禁用最小化和最大化按钮。此外,鼠标单击+拖动不会调整窗口大小。
II。未显示图标和关闭按钮:
不幸的是,WPF中没有此功能。为此,您可以尝试通过从Window类的SourceInitialized事件中调用[Get / Set] WindowLong(pInvoking in Win32)来设置WS_EX_DLGMODALFRAME窗口样式。
答案 4 :(得分:0)
我有一个解决方法,如果它适合你的结构。在Usercontrol NotificationDialogPopupView的代码中展示Usercontrol加载的事件(也可以使用MVVM实现)
Loaded="UserControl_Loaded"
并在Loaded事件中记下以下代码
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Window win = ((UserControl)sender).Parent as Window;
if(win != null)
{
win.WindowStyle = WindowStyle.None;
win.ResizeMode = ResizeMode.NoResize;
}
}