如何“合并”一个 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 的 <Compile>
元素,并在其下添加 <DependentUpon>
元素:
<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 的代码隐藏的主要内容,如果未能解决你的问题,请参考以下文章
.dll、.winmd 可以在 Unity 中读取,但不能在 XAML 项目中读取
wpf(Application 如何创建一个事件,及其Application相关的属性)