Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在WPF中的资源字典后面设置代码以进行事件处理?_Wpf - Fatal编程技术网

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

是否可以在WPF中的资源字典后面设置代码以进行事件处理?,wpf,Wpf,是否可以在WPF中的资源字典后面设置代码。例如,在按钮的usercontrol中,您可以在XAML中声明它。按钮单击的事件处理代码在控件后面的代码文件中完成。如果要使用按钮创建数据模板,如何在资源字典中为其按钮单击编写事件处理程序代码。XAML用于构建不包含代码的对象图。 数据模板用于指示如何在屏幕上呈现自定义用户对象。。。(例如,如果是列表框项)行为不属于数据模板的专业领域。重新绘制解决方案…我想你要问的是你想要一个ResourceDictionary的代码隐藏文件。你完全可以做到!事实上,您

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

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">
你完成了。您可以在代码中添加任何内容:方法、属性和事件处理程序

==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:Name元素:

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

如果要在加载自定义控件时连接到控件,可以使用OnApplyTemplate方法。要做到这一点,需要覆盖OnApplyTemplate。这是一种常见的做法,允许您的样式与控件断开连接。(风格不应取决于控件,但控件应取决于是否具有风格)。

Gishu-虽然这似乎是一种“通常不鼓励的做法”,但您可能希望这样做的原因之一是:

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

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


完全同意任何特定于应用程序功能的内容都不应该存在于资源字典的代码隐藏中。

现在,随着{x:Bind…}的出现,如果您想将数据模板放入共享的ResourceDictionary文件中,您需要为该文件提供代码隐藏。

结论:您是否建议使用带有代码隐藏的资源dic??我怀疑,我从未用过它。我不会——对我来说,它不合适。字典应该返回特定键的值。在OP的情况下,将代码与数据模板绑定。。我宁愿尝试另一种方法。。例如,使用命令模型。我需要更多关于OP问题的细节来推荐一个不同的解决方案。我完全不同意。对于MVVM,有一种情况下代码隐藏非常有用:开发附加属性。让它使用代码隐藏,然后将其移植到附加属性。这比从头开始开发附加属性要快得多,除非你的大脑有曼哈顿那么大。恐惧症我认为将字典从页面中分离出来的目的是关于主页xaml的可重用性和可读性。上面的解决方案对我也很有效。作为Ageek答案的补充:确保将codebehind类的完全限定名放在x:class属性中
x:Class=“MyCompany.MyProject.MySubFolder1.MyResourceDictionary”
否则,如果只放置x:Class=“MyResourceDictionary”,xaml解析器将找不到您的类。请确保在部分类codebehind中提供默认构造函数,并确保它调用InitializeComponent()。(在我的例子中,我使用MEF导出资源字典。)更新了向上投票的注释的代码段。我觉得有必要完成答案;一个常见的错误。我刚才做的:)如果你不喜欢,就回复。感谢您的回答。请注意(至少在wp8.1中)这不再有效,您必须创建一个自定义usercontrol,以便resourcedictionary引用。您还必须将resourcedictionary的XAML文件上的构建操作设置为“Page”,否则InitializeComponent()调用将无法编译。(ResourceDictionary XAML文件默认情况下通常设置为“Resource”)。正确的方法是使用命令,它还提供了启用和禁用按钮的功能,而您可以按照一些答案建议的方式来执行,这让我觉得有股黑客的味道。
Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
   ...
}