代码之家  ›  专栏  ›  技术社区  ›  Crippeoblade

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

wpf
  •  138
  • Crippeoblade  · 技术社区  · 16 年前

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

    4 回复  |  直到 16 年前
        1
  •  199
  •   Sevenate    8 年前

    我想你要的是一个资源字典的代码隐藏文件。你完全可以做到!实际上,您的操作方式与窗口相同:

    假设你有一本叫做MyResourcedictionary的资源字典。在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应用程序==

    以防万一你在玩 超宽带 还有一件事需要注意:

    <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>
    
        2
  •  9
  •   Phobis    16 年前

    我不同意“被困的年龄”…使用分部类的方法不是一个好的实践。那么,将字典与页面分离的目的是什么呢?

    通过代码隐藏,您可以使用以下命令访问x:name元素:

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

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

        3
  •  5
  •   Pete Maher    15 年前

    gishu-虽然这似乎是一个“一般不鼓励练习”,但您可能希望这样做的一个原因是:

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

    如果您希望默认的用户交互行为与开箱即用的行为不同,那么任何其他原因都可能是资源字典中代码隐藏的好候选者。

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

        4
  •  0
  •   Gishu    16 年前

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