如何隐藏PrismUserControl WPF中的“最小化”,“最大化”和“关闭”按钮?

时间:2016-08-31 07:37:08

标签: c# wpf mvvm prism

在我的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>

当我激活对话框时,它会显示,例如,如下所示: enter image description here

但正如您可以看到'最小化','最大化'和'关闭'按钮可见并启用。系统菜单(在对话框的左上角激活)也已启用。 如何隐藏“最小化”,“最大化”和“关闭”按钮并禁用系统菜单?

5 个答案:

答案 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)

我找到了两个解决方案:

1.禁用所有窗口属性:

Window.WindowStyle属性设置为WindowStyle.None

2.禁用按钮:

予。禁用最小化,最大化按钮:
这可以通过将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;

            }
        }