2010-07-23 95 views
8

有谁知道我为什么不能在控件模板上设置事件?WPF - ControlTemplate上的事件?

例如,下面的代码行不能编译。它通过控件模板中的任何事件来完成此操作。

<ControlTemplate x:Key="DefaultTemplate" TargetType="ContentControl"> 
    <StackPanel Loaded="StackPanel_Loaded"> 

    </StackPanel> 
</ControlTemplate> 

我使用的是MVVM设计模式,此处的控件位于添加到应用程序的MergedDictionaries的ResourceDictionary中。

+0

对于任何人有同样的问题,我使用一个Style和EventSetter作为替代,虽然我仍然想知道为什么我不能如果我正在使用ControlTemplate,则直接在控件上设置事件。 – Rachel 2010-07-26 12:24:39

回答

11

有谁知道我为什么不能在控件模板上设置事件?

实际上,你可以...但你期望事件处理程序被定义在哪里? ResourceDictionary没有代码隐藏,所以没有地方放置事件处理程序代码。你可以,但是,创建你的资源字典的类,并将其与x:Class属性相关联:

<ResourceDictionary x:Class="MyNamespace.MyClass" 
        xmlns=...> 

    <ControlTemplate x:Key="DefaultTemplate" TargetType="ContentControl"> 
     <StackPanel Loaded="StackPanel_Loaded"> 

     </StackPanel> 
    </ControlTemplate> 

C#代码:

namespace MyNamespace 
{ 
    public partial class MyClass : ResourceDictionary 
    { 
     void StackPanel_Loaded(object sender, RoutedEventArgs e) 
     { 
      ... 
     } 
    } 
} 

(你可能还需要更改的生成操作资源字典到“页面”,我不记得确切地...)

+0

这就是我目前所拥有的... ResourceDictionary的一个类,它的Build Action设置为Page。唯一的区别是我能看到的是我没有宣布它是公开的,但改变它并没有任何帮助。 – Rachel 2010-07-26 12:19:22

+0

究竟是什么问题?你有错误信息吗? – 2010-07-26 12:45:48

+0

当我去运行程序时,它会抛出一个NullReferenceException(它编译好)。它必须与我的设计模式有关,因为我尝试创建一个简单的测试用例,并且它的工作正常。我的主要应用覆盖app.xaml的OnStartup加载一堆不同的ResourceDictionaries,创建一个MainWindow的实例,设置它的DataContext,然后调用MainWindow.Show() - 最后一行是我得到异常的地方。将事件从ControlTemplate移至EventSetter可以消除错误。 – Rachel 2010-07-27 12:39:47