在WPF中是否可以在资源字典中设置代码后台?例如,在用户控件中,您可以在XAML中声明按钮,而按钮点击的事件处理代码则在控件后面的代码文件中完成。如果我要创建一个包含按钮的数据模板,如何在资源字典中编写其按钮点击的事件处理程序代码。
在WPF中是否可以在资源字典中设置代码后台?例如,在用户控件中,您可以在XAML中声明按钮,而按钮点击的事件处理代码则在控件后面的代码文件中完成。如果我要创建一个包含按钮的数据模板,如何在资源字典中编写其按钮点击的事件处理程序代码。
<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>
x:Class="MyCompany.MyProject.MySubFolder1.MyResourceDictionary"
,否则,如果您仅将x:Class设置为"MyResourceDictionary",XAML解析器将无法找到您的类。 - viggityButton myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
...
}
如果您想在自定义控件加载时连接到控件,则可以在OnApplyTemplate方法中执行this。需要重写OnApplyTemplate才能这样做。这是一种常见的做法,可以使您的样式与控件分离。(样式不应该依赖于控件,但控件应该依赖于具有样式)。
Gishu - 尽管这似乎是一种“通常不鼓励的做法”,但你可能想这样做的一个原因是:
当文本框获得焦点时,标准行为是将插入符放置在控件失去焦点时的相同位置。如果您希望在应用程序中始终如一地将整个文本框内容突出显示,那么在资源字典中添加一个简单的处理程序就可以解决问题。
任何其他需要默认用户交互行为与开箱即用行为不同的情况都是资源字典中代码后台的好选择。
完全同意,任何特定于应用程序功能的内容都不应该在资源字典的代码后台中。
另外,随着{x:Bind...}的出现,如果您想将DataTemplate放入共享的ResourceDictionary文件中,您需要为该文件提供一个代码后备。
XAML 用于构建对象图,而不是包含代码。
数据模板用于指示如何在屏幕上呈现自定义用户对象(例如,如果它是列表框项),行为不是数据模板专业领域的一部分。重新绘制解决方案...