我有这个xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:My.Windows"
>
<ObjectDataProvider x:Key="TitledWindow_Test" MethodName="Test" ObjectInstance={x:Type l:TitledWindow}">
<ControlTemplate x:Key="TitledWindowControlTemplateKey" x:Name="PART_ControlTemplate" TargetType="{x:Type l:TitledWindow}"
<Rectangle>
<Rectangle.Style>
<EventSetter Event="Mouse.MouseEnter" Handler="{StaticResource TitledWindow_Test}">
</Rectangle.Style>
</Rectangle>
</ControlTemplate>
</ResourceDictionary>
我的C#代码:
namespace My.Windows
{
public partial class TitledWindow : Window
{
public void Test()
{
MessageBox.Show("Test");
}
}
}
问题是,我得到以下错误:
**错误1
“ResourceDictionary”根元素需要x:Class特性才能支持XAML文件中的事件处理程序。请移除MouseEnter事件的事件处理程序,或向根元素添加x:Class特性。**
3条答案
按热度按时间brqmpdu11#
你可以通过将代码附加到你的ResourceDictionary来实现。实现这一点的几个简单步骤是:
CustomResources.xaml
。在同一目录中添加另一个文件,名称为CustomResources.xaml.cs
。创建继承自ResourceDictionary的partial class CustomResources
。声明MouseEnter的处理程序,隐藏代码就准备就绪了。
x:Class
属性并将处理程序设置为MouseEnter
。XAML格式:
iq0todco2#
您需要添加x:class属性并指定资源所在的位置,以及事件处理程序所在的位置,请参阅Is it possible to set code behind a resource dictionary in WPF for event handling?以了解这方面的示例。
yhxst69z3#
问题是
Template
需要知道它所应用的对象是否有MouseEnter
,不幸的是,即使将您的x:Type
应用到模板,xaml编译器也没有足够的资源继续运行。我以前做过类似的事情,让
ResourceDictionary
识别我正在模板化的属性,看起来我用了一种样式来解决它。完整代码在http://winchrome.codeplex.com/SourceControl/latest#WinChrome/UI/VS2012ResourceDictionary.xaml。但是你想通过
{StaticResource ...}
把你的句柄绑定到你的objectDataPresenter
上的一个方法,我不确定你能不能做到。相反,你可能更好地使用一个普通的绑定{Binding Path=...}
绑定到DataContext
上,我认为你仍然可以通过{StaticResource.. }
提供DataContext
。