是否可以在WPF中为资源字典设置代码以进行事件处理?

时间:2008-09-18 12:31:44

标签: wpf

是否可以在WPF中的资源字典后面设置代码。例如,在按钮的usercontrol中,您在XAML中声明它。按钮单击的事件处理代码在控件后面的代码文件中完成。如果我要使用按钮创建数据模板,我如何编写事件处理程序代码,以便在资源字典中单击按钮。

5 个答案:

答案 0 :(得分:201)

我认为你要问的是你想要一个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>

答案 1 :(得分:9)

我不同意“ageektrapped”...使用部分类的方法不是一个好习惯。那么将Dictionary与页面分开的目的是什么?

从代码隐藏中,您可以使用:

访问x:Name元素
Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
   ...
}

如果要在自定义控件加载时连接到控件,可以在OnApplyTemplate方法中执行this。需要重写OnApplyTemplate才能执行此操作。这是一种常见做法,允许您的风格与控件保持断开状态。 (样式不应该依赖于控件,但控件应该取决于具有样式)。

答案 2 :(得分:5)

Gishu - 虽然这似乎是“一般不被鼓励的练习”这是你可能想要这样做的一个原因:

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

补充....这些天,随着 {x:Bind ...} 的出现,如果您想将您的 DataTemplate 放入共享的 ResourceDictionary 文件中,您需要为该文件提供一个代码。< /p>