是否有可能在 WPF 中为事件处理设置资源字典后面的代码?

是否可以在 WPF 中设置资源字典后面的代码。例如,在用于按钮的用户控件中,用 XAML 声明按钮。按钮单击的事件处理代码在控件后面的代码文件中完成。如果我要创建一个带有按钮的数据模板,那么如何为它的按钮编写事件处理程序代码,请在资源字典中单击。

71444 次浏览

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

我认为您想要的是一个用于 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 的文件后面的代码,声明如下:

namespace MyCompany.MyProject
{
partial class MyResourceDictionary : ResourceDictionary
{
public MyResourceDictionary()
{
InitializeComponent();
}
... // event handlers ahead..
}
}

你可以把任何你想要的东西放在代码后面: 方法,属性和事件处理程序。

= = Windows10应用程序更新 = =

如果你正在使用 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: Name 元素:

Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
...
}

如果希望在自定义控件加载时连接到控件,可以在 OnApplicyTemplate 方法中执行 这个。要执行此操作,需要重写 OnApplicyTemplate。这是一种常见的做法,允许您的样式与控件保持断开连接。(样式不应取决于控件,但控件应取决于具有样式)。

O < o < o < o < o < o < o < o < o < o < o < o < o < o < o

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

您希望默认用户交互行为与开箱即用行为不同的任何其他原因似乎都可以作为资源字典中隐藏代码的很好候选者。

完全同意任何特定于应用程序功能的东西都不应该出现在资源字典的代码中。

如今,随着{ x: Bind... }的出现,如果您希望将 DataTemplate 放入共享的 ResourceDictionary 文件中,则需要为该文件提供一个代码。