是否可以在 WPF 中的资源字典后面设置代码。例如,在按钮的用户控件中,您在 XAML 中声明它。按钮单击的事件处理代码在控件后面的代码文件中完成。如果我要创建一个带有按钮的数据模板,我该如何为它在资源字典中的按钮单击编写事件处理程序代码。
5 回答
我想你要问的是你想要一个 ResourceDictionary 的代码隐藏文件。你完全可以做到这一点!实际上,您可以使用与 Window 相同的方式来执行此操作:
假设您有一个名为 MyResourceDictionary 的 ResourceDictionary。在 MyResourceDictionary.xaml 文件中,将 x:Class 属性放在根元素中,如下所示:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyCompany.MyProject.MyResourceDictionary"
x:ClassModifier="public">
然后,使用以下声明创建一个名为 MyResourceDictionary.xaml.cs 的代码隐藏文件:
namespace MyCompany.MyProject
{
partial class MyResourceDictionary : ResourceDictionary
{
public MyResourceDictionary()
{
InitializeComponent();
}
... // event handlers ahead..
}
}
你完成了。你可以在后面的代码中添加任何你想要的东西:方法、属性和事件处理程序。
== Windows 10 应用更新 ==
万一你在玩UWP,还有一件事需要注意:
<Application x:Class="SampleProject.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:rd="using:MyCompany.MyProject">
<!-- no need in x:ClassModifier="public" in the header above -->
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- This will NOT work -->
<!-- <ResourceDictionary Source="/MyResourceDictionary.xaml" />-->
<!-- Create instance of your custom dictionary instead of the above source reference -->
<rd:MyResourceDictionary />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
我不同意“ageektrapped”......使用部分类的方法不是一个好习惯。那么将字典与页面分开的目的是什么?
从代码隐藏中,您可以使用以下命令访问 ax:Name 元素:
Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
...
}
如果要在加载自定义控件时连接到控件,可以在 OnApplyTemplate 方法中执行此操作。需要重写 OnApplyTemplate 才能执行此操作。这是一种常见的做法,可以让您的样式与控件保持断开连接。(样式不应该依赖于控件,但控件应该依赖于具有样式)。
Gishu - 虽然这似乎是一种“通常不被鼓励的做法”,但您可能想要这样做的一个原因是:
文本框获得焦点时的标准行为是将插入符号放置在与控件失去焦点时相同的位置。如果您希望在整个应用程序中,当用户选择任何文本框时突出显示文本框的全部内容,那么在资源字典中添加一个简单的处理程序就可以了。
您希望默认用户交互行为与开箱即用行为不同的任何其他原因似乎都是资源字典中隐藏代码的良好候选者。
完全同意任何特定于应用程序功能的东西都不应该在资源字典后面的代码中。
再加上……这些天,随着 {x:Bind ...} 的出现,如果你想把你的 DataTemplate 放到一个共享的 ResourceDictionary 文件中,你需要给那个文件一个代码。
XAML 用于构建不包含代码的对象图。
数据模板用于指示如何在屏幕上呈现自定义用户对象...(例如,如果它是列表框项)行为不是数据模板专业领域的一部分。重新绘制解决方案...