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

Wpf:将参数传递给ResourceDictionary

  •  1
  • Andrew  · 技术社区  · 15 年前

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

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

    安得烈

    2 回复  |  直到 15 年前
        1
  •  0
  •   Ian Griffiths    15 年前

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

    通常将过于复杂的Xaml文件拆分为几个更易于管理的较小文件的机制是用户控件。(资源字典 合并 当你已经有了一本资源字典,而且它太大的时候,就开始发挥作用了。但是你通常不会仅仅为了把事情分开而引入一个资源字典。相反,资源字典倾向于鼓励过大的Xaml文件,这就是为什么字典合并必须首先被发明!)

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

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

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

    而且您很可能不再需要将这些模板放入单独的文件中。但是因为每个模板的核心现在都在用户控件中,这给了你一个放置代码的地方。

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

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

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

        2
  •  1
  •   Aaron McIver    15 年前

    你知道你可以 merge your Resource Dictionaries 然后引用 DataTemplate 在那些字典里 TreeView .