我目前正在尝试向ResourceDictionary添加功能,方法是声明它的x:Class并将On Click事件链接到所述类中的函数。这是一个例子:
我的x:Class的来源:
using System;
using System.Windows;
namespace VoidwalkerEngine.Editor.Resources.Themes.Styles
{
public partial class VoidwalkerCellBrowserTreeView : ResourceDictionary
{
public VoidwalkerCellBrowserTreeView()
{
InitializeComponent();
}
private void BaseTreeView_NewFolder_Click(object sender, RoutedEventArgs e)
{
Console.WriteLine("Test"); // This should be fired when I click on "New Folder"
}
}
}
单击菜单项后,应打印"测试"到控制台。然而,没有任何反应。显然,我必须做错事。我也找到了一个与我相似的问题:Control event not firing from class linked to resource dictionary wpf
然而,这仍然无效。显然我还没有正确地联系到某些东西,我只是不知道如何从这里开始。 有谁知道如何正确地将ResourceDictionary与它连接?sx:Class?我的项目没有丢失错误,Visual Studio甚至自动完成了BaseTreeView_NewFolder_Click
函数到x:类文件,所以我知道源文件本身附加得很好。
编辑1: 这是完整的XAML ResourceDictionary:https://pastebin.com/8UepKGTa
编辑2: 在测试了一些东西后,我发现了一些非常奇怪的东西。显然,我将触发默认构造函数中的任何控制台命令,但不会触发任何方法。这是一张图片:
答案 0 :(得分:1)
您无需在csprroj中手动添加该内容。 它的工作方式就像一扇窗户。 您需要在资源字典中引用该类:
代码文件必须从resourcedictionary继承并成为部分类:
namespace MapEditor
{
public partial class TerrainResources : ResourceDictionary
你需要初始化组件:
public TerrainResources()
{
InitializeComponent();
}
类属性构建操作应该是编译编译 当然资源字典必须是构建操作页面。
查看您的代码,乍一看它看起来应该有效。 你有一个很长的命名空间。 对于深层文件夹结构和非常长的命名空间,VS无法很好地使用。
您的menuitem在哪里? 我在那里使用我的代码来处理加载的事件,并且从资源字典中的datatemplates中使用它:
<DataTemplate DataType="{x:Type local:SwampVM}">
<Polygon Points="{Binding Points}"
Fill="YellowGreen"
local:TerrainProp.TerrainCanvas="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}"
FrameworkElement.Loaded="Terrain_Loaded"
您的上下文菜单必须是资源字典中的资源才能使用该事件。