如何“合并”一个 XAML 文件及其与 Visual Studio 的代码隐藏

Posted

技术标签:

【中文标题】如何“合并”一个 XAML 文件及其与 Visual Studio 的代码隐藏【英文标题】:How to 'merge' a XAML file and its code-behind with Visual Studio 【发布时间】:2013-08-09 21:33:47 【问题描述】:

我在名为“MyTemplate.xaml”的 XAML 文件中定义了一个模板。此模板使用名为“MyTemplate.cs”的代码隐藏文件。

Mytemplate.xaml

<ResourceDictionary x:Class="Project.Templates.MyTemplate">
    <DataTemplate ... />
</ResourceDictionary>

MyTemplate.cs

namespace Project.Templates

    public partial class MyTemplate : ResourceDictionary
    
        ...
    

在 Visual Studio 解决方案资源管理器中,这两个文件并排放置。我想做的是将这两个文件放在一起,就像使用控件及其代码隐藏一样。

我有什么:

我想要的:

最好的方法是什么?谢谢。

【问题讨论】:

你为什么要这样做......我的意思是,一旦你有了这个“合并”文件,你的目标是什么? 在解决方案资源管理器中更加清晰。它允许我查看哪个模板文件与哪个模板代码隐藏相关联。你不觉得它对控件有用吗? 在这种情况下,请解释如何在不使用代码隐藏的情况下将事件处理程序添加到模板... 我添加了一个建议答案。 @Sheridan,“代码隐藏页面是老派”,真的吗?仅仅因为您使用 MVVM 模式并不意味着您不能使用代码隐藏;在很多情况下,代码隐藏是做某事的正确位置,特别是如果它纯粹与 UI 相关。 【参考方案1】:

您需要编辑 .csproj 文件。找到 MyTemplate.cs 的 &lt;Compile&gt; 元素,并在其下添加 &lt;DependentUpon&gt; 元素:

<Compile Include="MyTemplate.cs">
  <DependentUpon>MyTemplate.xaml</DependentUpon>
</Compile>

查看这篇博文:make a project item a child item of another

【讨论】:

谢谢!这正是我所需要的。当我在右键单击模板后选择“查看代码”时,有没有办法让 Visual 打开 .cs 文件而不是 XAML 文件? @MorganM.,对我来说,它打开了代码隐藏...也许文件必须命名为 MyTemplate.xaml.cs 是的,这适用于“.xaml.cs”而不是“.cs”。谢谢你:) 此外,如果代码隐藏文件的名称与 XAML 文件的名称相同 + .cs 扩展名之前的 .xaml 后缀,则会自动创建依赖项。 指出Include 值可能是文件的相对路径,如Views\Controls\MyTemplate.xaml.cs,而DependentUpon 值只是文件名,在这种情况下为@ 987654328@.【参考方案2】:

这不是对您最初问题的回答,而是对以下问题的回答:

在这种情况下,请说明如何在不使用代码隐藏的情况下向模板添加事件处理程序

您可以使用 ViewModel 和 ICommand 类来做到这一点。

首先,您需要创建 ViewModel 类,使用无参数构造函数将其设为公开且非静态。

然后创建另一个实现 ICommand 接口的类:

public class Command : ICommand

    public void Execute(object parameter)
    
        //this is what happens when you respond to the event
    

    public bool CanExecute(object parameter)
    
        return true;
    

    public event EventHandler CanExecuteChanged;

将命令类的实例添加到 ViewModel 类,将其设为私有并通过只读属性公开:

public class ViewModel

    private readonly ICommand _command = new Command();

    public ICommand Command
    
        get  return _command; 
    

在 App.xaml 文件中将 ViewModel 添加为静态资源:

<Application.Resources>
     <wpfApplication1:ViewModel x:Key="ViewModel"/>
</Application.Resources>

将 XAML 文件的 DataContext 设置为 ViewModel:

<Window DataContext="StaticResource ViewModel">

现在通过绑定到 Command 类来响应您的事件:

<Button Click="Binding Command"></Button>

繁荣,没有代码隐藏。希望这会有所帮助。

【讨论】:

这确实不是我的问题的答案,但我不知道这种在没有代码隐藏的情况下实现事件处理程序的方式。谢谢你:)【参考方案3】:

另一种方法是:

添加/创建新的 XAML 文件/项 将旧的 .xaml 和 xaml.cs 内容复制并粘贴到新的等效文件中 删除单独的文件 重命名新文件

【讨论】:

以上是关于如何“合并”一个 XAML 文件及其与 Visual Studio 的代码隐藏的主要内容,如果未能解决你的问题,请参考以下文章

VisualStudio 合并代码文件

.dll、.winmd 可以在 Unity 中读取,但不能在 XAML 项目中读取

wpf(Application 如何创建一个事件,及其Application相关的属性)

如何编写查询以将两个帐户及其活动日志合并为一个? [关闭]

在 Python 中使用 Pandas 合并时间序列数据帧及其集体附加注释

将 2 个视频文件及其音频并排合并到一个文件中