【问题标题】:A way to add a WPF window into a C# Form Application一种将 WPF 窗口添加到 C# 表单应用程序中的方法
【发布时间】:2012-10-29 18:09:27
【问题描述】:

我想让表单加载具有透明背景和非矩形形状的初始屏幕,并且可以点击。这可能吗 ?它是如何制作的?

我想知道是否有办法让 Form1 在同一个 vs 项目中调用 WPF 窗口(作为一种启动屏幕)。

我尝试在 VS 的项目资源管理器中右键单击项目 -> 添加,然后我正在搜索 WPF 窗口。但我唯一能添加的是“wpf User Controll”。

到目前为止一切顺利,但如果我启动应用程序,它会给我一个错误,说我应该添加对 System.Windows.markup.IQueryAmbient 的引用,但我在列表中找不到它 (.NET)

我做错了什么?在 Forms 应用程序项目中实现 WPF 窗口的正确方法是什么?

感谢所有建议。

编辑:

这是 Adob​​e Flash Professional CS6 的启动画面,它几乎准确地解释了我想要拥有的东西。包含半透明和全透明部分的非矩形图像 http://webalazar.com/wp-content/uploads/2012/09/Adobe-Flash-Professional-CS6.png

【问题讨论】:

    标签: c# .net wpf forms wpf-controls


    【解决方案1】:

    有 3 种方法可以做到这一点:

    1.) 完全使用 WPF,然后在您的 WPF 应用程序中引用 WinForms .NET 库,如果您需要 WinForms 特定的东西

    2.) 创建一个新的 WPF 库(一个可以在您的代码中引用的 .NET dll),其中包含您想要的所有 WPF 功能(例如您的初始屏幕),然后创建一个新的 WinForms .NET 应用程序和在您的 WinForms 项目中引用 WPF 项目,然后从您的 WinForms 应用程序中调用您的 WPF 库

    3.) 根据您尝试完成的任务(例如特殊的图形窗口或其他“花哨”的 UI 内容),以及您愿意投入多少时间/精力,您可以学习 DirectX,或使用'gdi32.dll' 并导入它的 GDI+ 功能。

    编辑:

    下面是一步一步在 WindowForm C# 应用程序中获取 WPF 启动画面:

    1.) 创建一个新的 C# Windows 窗体应用程序,随意调用它并保存在任何你想要的地方

    2.) 文件->添加->新建项目

    3.) 添加一个新的 C# WPF 用户控件库,将其命名为 SplashScreen 并确保注意它会尝试将其保存在同一文件位置,因此如果您想将其保存在其他位置,请务必选择不同的位置。

    4.) 删除在 SplashScreen WPF 库中创建的默认“UserControl1.xaml”

    5.) 右键单击​​ WPF 项目并“添加->窗口”,然后将其命名为 SplashScreen.xaml

    6.) 将 SplashScreen.xaml 中的所有现有代码替换为以下内容:

    <Window x:Class="SplashScreen.SplashScreen"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            WindowStyle="None" Background="Transparent" AllowsTransparency="True"
            ShowInTaskbar="False" SizeToContent="WidthAndHeight"
            Title="SplashScreen" WindowStartupLocation="CenterScreen">
        <Image Source="logo.png" Stretch="None" />
    </Window>
    

    7.) 右键单击​​ WPF 项目和“添加->现有项目”,确保您的文件过滤器设置为“所有文件”并选择您的“logo.png”。

    8.) 查看新导入的“logo.png”的属性并确保其“构建操作”设置为“资源”

    9.) 在您的 Windows 窗体项目中右键单击“添加->新建引用”,选择“项目”选项卡并选择您刚刚创建的“SplashScreen”WPF 项目。

    10.) 在您的 Windows 窗体项目中,右键单击“添加->新引用”,选择“.NET”选项卡并选择“PresentationFramework”、“PresentationCore”、“WindowsBase”和“System.Xaml”库。

    11.) 在 Windows 窗体项目的“Program.cs”文件中,您现在可以执行以下操作:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace MyGame
    {
        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                // Create a new 'splash screen instance
                SplashScreen.SplashScreen ss = new SplashScreen.SplashScreen();
                // Show it
                ss.Visibility = System.Windows.Visibility.Visible;
                // Forces the splash screen visible
                Application.DoEvents();
                // Here's where you'd your actual loading stuff, but this
                // thread sleep is here to simulate 'loading'
                System.Threading.Thread.Sleep(5000);
                // Hide your splash screen
                ss.Visibility = System.Windows.Visibility.Hidden;
                // Start your main form, or whatever
                Application.Run(new Form1());
            }
        }
    }
    

    【讨论】:

    • GDI+ 到底是什么?我能用这个做什么?如果我将(我想稍后在其中实现的游戏)客户端程序作为 WPF 窗口应用程序而不是将其作为 Winform 应用程序,这会是性能差异吗? (游戏是基于 D3D 的,将添加到带有框架的 winform 窗口中)
    • 你有制作这些 dll 的示例或分步说明吗?
    • 这不是图片处理api吗?我只需要让我的启动画面看起来像 Adob​​e PS cs6 之一,鼠标可以点击代表启动画面的图像的空白部分
    • 你有很多不同的技术混合在一起,WPF、WinForms、D3D。您具体要完成什么?如果您使用 winforms 应用程序仅加载您在 D3D 中创建的游戏,请坚持使用 D3D 并在其中创建一个新的主启动画面。您的 C# 应用程序将专门做什么来与游戏交互?
    • 抱歉,我在阅读其他评论之前发布了我之前的评论,但是是的,GDI+ 本质上是一个图像处理 API(图形设备接口),它允许 C/C++ 程序与矢量( 2D)图形,它提供了您想要的功能,但如果您想要的只是简单的启动屏幕,请参考:stackoverflow.com/questions/9666910/…
    【解决方案2】:
    1. 创建 Windows 窗体
    2. 将其FormBorderStyle 设置为无
    3. 将其TransparencyKey 设置为#00FF00
    4. 将其 BackgroundImage 设置为 png 图像,并将不需要的区域颜色设置为 #00FF00
    5. 完成!

    当您将图像加载为表单的背景图像时,它会将其每个像素与透明度键进行比较,如果匹配,则将该像素呈现为透明。

    【讨论】:

    • 不错的尝试,但正如我在那里评论的那样,使用透明度键会导致看起来很糟糕的像素与平滑和 oundet 图像
    猜你喜欢
    • 2011-04-09
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多