Wpf:将参数传递到ResourceDictionary

Wpf:将参数传递到ResourceDictionary,wpf,resourcedictionary,Wpf,Resourcedictionary,有没有办法将参数传递给资源字典?我认为,为了指定事件处理程序,我可以在后面附加代码,但不幸的是,我还需要从事件处理程序访问对父控件的引用。我相信,可以通过在xaml中为资源字典指定x:Class属性,然后在同一文件夹中创建一个类来附加代码隐藏,该类的文件名类似于[resource dictionary name].xaml.cs 其目的是分离我在单个treeview控件中使用的四个层次数据模板的代码。treeview的xaml看起来有点长,有点难看,所以我希望把它分解成四个资源字典。欢迎有任何想

有没有办法将参数传递给资源字典?我认为,为了指定事件处理程序,我可以在后面附加代码,但不幸的是,我还需要从事件处理程序访问对父控件的引用。我相信,可以通过在xaml中为资源字典指定x:Class属性,然后在同一文件夹中创建一个类来附加代码隐藏,该类的文件名类似于[resource dictionary name].xaml.cs

其目的是分离我在单个treeview控件中使用的四个层次数据模板的代码。treeview的xaml看起来有点长,有点难看,所以我希望把它分解成四个资源字典。欢迎有任何想法


Andrew

您知道您可以然后根据需要在
树视图中引用这些词典中的
数据模板

您知道您可以然后根据需要在
树视图中引用这些词典中的
数据模板
资源词典听起来有点像做这件事的奇特方法。资源字典都是关于共享实例的-它们允许您从多个位置使用某个事物的单个实例(例如,样式、模板、笔刷或其他)。它们实际上并不是一种将用户界面划分为多个部分以简化单个Xaml文件的机制

将过于复杂的Xaml文件拆分为几个更易于管理的小文件的常用机制是用户控件。(当你已经有了一个资源字典,而且它太大时,资源字典合并就开始发挥作用。但是你通常不会仅仅为了开始拆分东西而引入一个资源字典。相反,资源字典倾向于鼓励过大的Xaml文件,这就是为什么字典合并必须在第一阶段发明的原因(t地点)

大多数时候,当我定义一个数据模板时,我让它只包含一个用户控件。如果这变得更复杂,我会把用户控件分成更多的用户控件

根据您的描述,您的Xaml文件似乎变得很大了,因为其中有四个大的分层数据模板。如果您将每个模板的主体转换为用户控件,那么您的四个模板将变得非常简单,如下所示:

<HierarchicalDataTemplate x:Key="t1" ItemsSource="{Binding Path=Children}">
    <loc:TreeItemTypeOne />
</HierarchicalDataTemplate>

您很可能不再需要将这些模板放入单独的文件中。但由于每个模板的核心现在都在用户控件中,这就为您提供了一个放置代码的位置

您提到需要引用父控件。这让我担心——这听起来好像你的代码隐藏中有太多的代码。但一次只做一件事。。。您可以通过在用户控件上定义名为ParentControl的依赖项属性来解决该问题,然后将其放入模板中:

<loc:TreeItemTypeOne
    ParentControl="{Binding RelativeSource=
        {RelativeSource AncestorType=loc:ParentControlType}}" />


但坦率地说,当我发现自己处于一个需要这样做的位置时,我会问自己:我是如何让自己处于一个似乎有必要这样做的位置的,我能做些什么来解决这个问题呢?

资源字典听起来有点奇怪。资源字典都是关于共享实例的-它们允许您从多个位置使用某个事物的单个实例(例如,样式、模板、笔刷或其他)。它们实际上并不是一种将用户界面划分为多个部分以简化单个Xaml文件的机制

将过于复杂的Xaml文件拆分为几个更易于管理的小文件的常用机制是用户控件。(当你已经有了一个资源字典,而且它太大时,资源字典合并就开始发挥作用。但是你通常不会仅仅为了开始拆分东西而引入一个资源字典。相反,资源字典倾向于鼓励过大的Xaml文件,这就是为什么字典合并必须在第一阶段发明的原因(t地点)

大多数时候,当我定义一个数据模板时,我让它只包含一个用户控件。如果这变得更复杂,我会把用户控件分成更多的用户控件

根据您的描述,您的Xaml文件似乎变得很大了,因为其中有四个大的分层数据模板。如果您将每个模板的主体转换为用户控件,那么您的四个模板将变得非常简单,如下所示:

<HierarchicalDataTemplate x:Key="t1" ItemsSource="{Binding Path=Children}">
    <loc:TreeItemTypeOne />
</HierarchicalDataTemplate>

您很可能不再需要将这些模板放入单独的文件中。但由于每个模板的核心现在都在用户控件中,这就为您提供了一个放置代码的位置

您提到需要引用父控件。这让我担心——这听起来好像你的代码隐藏中有太多的代码。但一次只做一件事。。。您可以通过在用户控件上定义名为ParentControl的依赖项属性来解决该问题,然后将其放入模板中:

<loc:TreeItemTypeOne
    ParentControl="{Binding RelativeSource=
        {RelativeSource AncestorType=loc:ParentControlType}}" />


但坦率地说,当我发现自己处于一个需要这个的位置时,我会问自己:我是如何让自己处于一个似乎必要的位置的,我能做些什么来解决这个问题?

注意,键不能在单个ResourceDictionary中复制。因此,在合并到更大的资源字典中的两个资源字典中,不能有具有相同键的样式。不太相关,但值得一提。请注意,键不能在单个ResourceDictionary中重复。因此,在合并到更大的资源字典中的两个资源字典中,不能有具有相同键的样式。不太相关,但值得一提。谢谢伊恩,这是一个很棒的答案。我之所以在代码背后遇到这么多麻烦,是因为拖放功能。每个分层数据模板都有一个堆栈面板,可以将其拖动到树中的另一项。我必须设法实施