是否有可能在WPF资源字典后面设置代码以进行事件处理?

是否有可能在WPF资源字典背后设置代码。 例如,在一个用户控件的button中,用XAML声明它。 button点击的事件处理代码在控件后面的代码文件中完成。 如果我要创build一个带有button的数据模板,我该如何编写事件处理程序代码,以便在资源字典中单击button。

我想你问的是你想要一个ResourceDictionary的代码隐藏文件。 你完全可以做到这一点! 实际上,您可以像使用窗口一样进行操作:

假设你有一个名为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的文件后创build一个代码:

 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 – 虽然这似乎是“一般不被鼓励实践”这是你可能想要做的一个原因:

文本框获得焦点时的标准行为是将脱字符放置在控件失焦时的相同位置。 如果你希望在整个应用程序中,当用户选中任何文本框,文本框的整个内容被突出显示,那么在资源字典中添加一个简单的处理程序就可以了。

任何其他的原因,你希望默认的用户交互行为不同于开箱即用的行为似乎是在资源字典中的代码后面的好候选人。

完全同意,应用程序function特定的任何东西都不应该放在资源字典后面的代码中。

XAML用于构造不包含代码的对象图。
数据模板用于指示如何在屏幕上呈现自定义用户对象…(例如,如果它是列表框项)行为不是数据模板的专业知识领域的一部分。 重新绘制解决scheme…