【问题标题】:Drop Shadow On A Borderless Form (Powershell GUI)在无边界表单上投影(Powershell GUI)
【发布时间】:2020-04-25 05:34:41
【问题描述】:

$Form.FormBorderStyle = 'None' 时如何在无边框的窗体上绘制阴影?我找到了几个solutions,但它们是针对 C# 的。我认为 Powershell 也有类似的选项,但我仍然找不到。感谢您的回答。

【问题讨论】:

  • Powershell 不是 GUI 设计工具。您将在 PowerShell 中编写的任何 GUI 都使用 .Net 库,这就是您看到 C# 等的原因。表单设计和控制是通过 Winforms / WPF 库、API 等,而不是 PowerShell,因此,请查看 Winforms/ WPF 文档。

标签: powershell


【解决方案1】:

PowerShell .NET,C# 也是。大多数相同的 .NET 库将在 PowerShell 中像在 C# 中一样工作,但由于脚本执行与已编译的 .NET 程序的不同,会出现一些奇怪的边缘情况。如果您从 C# 中找到示例,通常可以创建相同的对象并调用您在 C# 示例中看到的相同方法。 这是大多数情况下的首选方法,用于将 C# 调用转换为 PowerShell 语法。

但是,PowerShell 比这更进一步,还允许您编译和执行临时 C# 代码For example:

$assemblies=(
    "System"
)

$source=@"
using System;
namespace Helloworld
{
    public static class Hello{
        public static void Main(){
            Console.WriteLine("Hello, world!");
        }
    }
}
"@

Add-Type -ReferencedAssemblies $assemblies -TypeDefinition $source -Language CSharp
[HelloWorld.Hello]::Main()

上面的代码所做的是编译一个简短的 hello-world 样式类,并在 Add-Type 完成后使其成员可用于 PowerShell 会话。虽然通常应避免使用此技术,而应直接从 PowerShell 调用 .NET 成员,但在某些情况下(例如使用 P/Invoke 访问 Win32 API 的情况)这会变得有用,并且是您唯一真正的选项。

还有第三种选择。除了像上面那样临时编译 C# 代码,您还可以构建一个适当的 .NET DLL,并使用 Add-Type 加载它。这比在每次执行时编译 C# 更安全,但不太方便:

# Assume we have Library.dll already built
# and it consists of the same code as the `$source` in the block above
Add-Type -Path C:\path\to\Library.dll
[HelloWorld.Hello]::Main()

【讨论】:

  • 谢谢。是的,据我在教授PowerShell的过程中了解到,这些语言是相似的,而且PowerShell是由C#创建的。更令人惊讶的是,目前还没有人在 PowerShell 中模拟出形状阴影。
【解决方案2】:

根据新知识,我自己写下我的问题的答案。

$Shadow = @'

using System;
using System.Windows;
using System.Windows.Forms;

namespace Program
{
    public partial class Shadow: Form
    {
        protected override CreateParams CreateParams
        {
            get
            {
                var сp = base.CreateParams;
                сp.ClassStyle |= 0x00020000;
                return сp;
            }
        }    
    }
}
'@

Add-Type -TypeDefinition $Shadow -Language CSharp -ReferencedAssemblies System, System.Windows, System.Windows.Forms

# Next, instead of your object $Form = New-Object System.Windows.Forms.Form, you need to write this:
$Form = New-Object Program.Shadow

我从未在干净的 PowerShell 上找到解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多