【问题标题】:How do you make a WPF application from an Empty Project?你如何从一个空项目中创建一个 WPF 应用程序?
【发布时间】:2013-12-09 17:08:07
【问题描述】:

在编写 WinForms 应用程序时,我总是从一个空项目开始,然后添加一个应用程序类、表单等......这样做,我可以从头开始构建应用程序,保持它干净,没有所有“绒毛” "的标准 WinForms 项目,为您添加表单等。

我想对 WPF 做同样的事情。我已经创建了我的应用程序类,创建了一个 Window 类,我可以很好地运行该应用程序,但是没有与该窗口关联的 XAML,因为我只是将它声明为 Window 的派生类。

我的问题是,是否可以将 WPF -Windows 添加到 WinForms -Forms 之类的项目中,以便同时添加 XAML,并且可以使用设计器来布局控件等...?还是我必须使用罐装的“WPF 项目”并从那里开始?

显然不可能创建一个空项目并添加支持 XAML 的 Windows。如果有人知道为什么,我将不胜感激。 (但是,您可以创建以编程方式生成的窗口,或者如果您希望在默认 WPF 项目中拥有自己的启动对象,只需删除 App.xaml 并使用静态 Main() 添加您自己的类。) em>

class OrderEntry : System.Windows.Application
    {
        [STAThread]
        static void Main(string[] commandLine)
        {
            OrderEntry app = new OrderEntry();
            app.MainWindow = new WindowMain();
            app.MainWindow.Show();
            app.Run();
        }
    }

public partial class WindowMain : System.Windows.Window
{

}

工作正常,但 WindowMain 没有与之关联的 XAML。

【问题讨论】:

  • 如果您需要创建 WPF 应用程序。使用File -> New Project -> WPF Application. 默认 WPF 项目是干净的。不要试图重新发明轮子。它已经被微软发明了,他们比我们任何人都清楚。
  • @user2942249 我不知道你所说的“魔法”是什么意思。只有1个ApplicationDefinition,还有一个默认的Window,可以去掉。根本没有“魔法”。
  • @user2942249 没有这样的东西。 Application.Run()PresentationFramework.dll 中定义。
  • @user2942249 错误。 Main() 方法在App.g.i.cs 中生成,由App.xaml 文件的Build Action 自动生成。你为什么关心这些?如果您不想这样做,请完全删除 App.xaml 文件,然后自己定义 Main() 方法。
  • @user2942249 是的。我仍然看不到这样做的必要性。你正在浪费时间。

标签: .net wpf winforms xaml


【解决方案1】:

回答您的问题,是的 - 可以根据需要将基于 XAML 的窗口添加到项目中。

诀窍是确保您的项目 type 是正确的,因为这决定了您在 Add->New...

时将看到的模板项列表

如果您在解决方案资源管理器中找到正确的项目,请右键单击并选择Unload Project,然后再次右键单击它并选择Edit,您将获得 XML 格式的项目文件。在其中您将看到类似于以下内容的一行:

<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

这些 GUID 指示您将在添加列表中看到哪些项目或文件模板。您可以在上一个 SO 问题 Visual Studio project type guids 和其中一个答案 INFO: List of known project type Guids 中链接的博客文章中找到更多详细信息

【讨论】:

  • 还有一个难以察觉的微小修改。 WPF 应用程序在AssemblyInfo.cs 中具有[assembly:ThemeInfo] 属性。其余的只是复制粘贴正确的项目项。
【解决方案2】:

这是我尝试过的,它对我有用

  1. 从 Visual Studio 2013 模板创建一个空项目
  2. 为 Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\ 中存在的以下 dll 添加参考
  3. 通过文本编辑器修改位于项目根文件夹的 .csproj 文件。在&lt;PropertyGroup&gt; 节点中为&lt;ProjectTypeGuids&gt; 添加以下条目。

    {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}

Read more about Project Type Guids here

  1. 更改&lt;OutputType&gt;WinExe&lt;/OutputType&gt;

    <PropertyGroup>
    <ProjectGuid>{C60226AB-DDB6-49C2-8B0D-F59E6B590236}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    

  2. 将 App.Xaml 文件添加到您的应用程序并像这样替换其内容

注意这里 WpfApplication1 是默认命名空间,我们还没有创建 MainWindow.xaml

  1. 修改后面的代码,继承自Application
  2. 修改.csproj,在&lt;ItemGroup&gt;下添加&lt;ApplicationDefinition&gt;

例如:

  <ItemGroup>
     <ApplicationDefinition Include="App.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </ApplicationDefinition>
    <Page Include="MainWindow.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Compile Include="MainWindow.xaml.cs">
      <DependentUpon>MainWindow.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
  </ItemGroup>

注意 MainWindow 是我稍后添加的文件。

现在我们可以创建 XAML 支持的窗口

【讨论】:

  • @pirate-x 似乎编辑删除了 App.Xaml 内容:)
  • 确实如此。请代码格式化吧,一定是我的错。道歉。
  • 在项目文件中将 App.xaml 从页面更改为 ApplicationDefinition 解决了我遇到的关于缺少静态“主要”方法的错误。谢谢!
【解决方案3】:

正如 HighCore 在 cmets 中所说,最好使用给定的 WPF FCL/模板,我也同意这一点。但是如果你仍然想要自己的 xaml 那就这样做吧

1) 将 Xml 文件添加到您的 View Project 并保留其扩展名 .xaml,例如 WindowMain.xaml

2) 删除下面一行

<?xml version="1.0" encoding="utf-8" ?> 

3)复制粘贴

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

</Window>

4) 将 x:class 属性添加到 Window 元素中,并设置另一个属性,例如标题高度宽度等

 <Window x:Class="Namespace.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MyWindow" Height="350" Width="525">

</Window>

5) 关闭项目并编辑项目文件,如

<Page Include="MainWindow.xaml">
  <Generator>MSBuild:Compile</Generator>
  <SubType>Designer</SubType>
</Page>

<Compile Include="MyWindow.xaml.cs">
  <DependentUpon>MyWindow.xaml</DependentUpon>
  <SubType>Code</SubType>

//或 MainWindow.cs 主窗口.xaml 代码

6) 保存并关闭

7)打开你的项目,你会在 .xaml 文件下找到你的 .cs 文件,正如我们在 DependentUpon 中提到的那样

8) 将构造函数添加到您的部分类并调用 InitializeComponent() 方法

public MainWindow()
    {
        InitializeComponent();
    }

这对我有用。但这就是我们通过使用 WPF Window 完全由 Wpf 自己提供的所有内容。而且我假设您的 App 类已正确构建和工作,但我怀疑您在 App Run 之前调用 window Show。我希望这会有所帮助。

【讨论】:

  • @user2942249 使用默认的 WPF 项目模板。
  • @HighCore - 问题的重点是“如何在没有模板的情况下从头开始一个项目”? “使用默认模板”的答案不是可接受的答案。可接受的答案形式为“是的,这是可能的,这就是方法”或“不,这是不可能的,因为 x、y 和 z”
  • @user2942249 我的问题是你有一个XY Problem。你没有给出任何理由why 你一开始就想这样做。就好像你问...“我怎样才能在 C# 中使 2 == 1? - 你想要那个做什么?这没有任何意义
  • @HighCore - 我在问题中给出了一个原因,因为这就是我从一个空项目制作我的 WinForms 项目的方式。
  • @HighCore - 那为什么可以将 WinForm 添加到空项目而不是 WPFWindow?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 2011-05-16
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多