【问题标题】:Wpf: Passing Parameters To A ResourceDictionaryWpf:将参数传递给 ResourceDictionary
【发布时间】:2010-11-28 22:41:57
【问题描述】:

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

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

安德鲁

【问题讨论】:

    标签: wpf resourcedictionary


    【解决方案1】:

    您知道您可以merge your Resource Dictionaries,然后根据需要在TreeView 中引用这些字典中的DataTemplate

    【讨论】:

    • 请注意,键不能在单个 ResourceDictionary 中重复。因此,您不能在合并到更大资源字典中的两个资源字典中拥有具有相同键的样式。不是很相关,但值得一提。
    【解决方案2】:

    资源字典听起来有点奇怪。资源字典都是关于共享实例的——它们让您可以从多个地方使用某物的单个实例(例如样式、模板、画笔或其他任何东西)。它们并不是真正用于划分 UI 以简化单个 Xaml 文件的机制。

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

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢伊恩,这是一个很棒的答案。我在代码隐藏方面遇到这么多麻烦的原因是拖放功能。每个分层数据模板都有一个堆栈面板,可以将其拖到树中的另一个项目。在标记您的答案正确之前,我必须尝试实现这一点,但我会回来的。我要花很长时间才能得出这些结论!很好的答案!
    猜你喜欢
    • 2020-06-07
    • 1970-01-01
    • 2010-11-24
    • 2021-12-29
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多