【问题标题】:How is the default template of a custom control applied with out using "Themes\Generic.xaml ?"如何在不使用“Themes\Generic.xaml”的情况下应用自定义控件的默认模板?
【发布时间】:2014-07-28 06:54:44
【问题描述】:

我使用其默认模板创建了一个自定义内容控件。 但是,该模板并未像应有的那样位于“Themes\Generic.xaml”位置。相反,我将它放在一个不同名称的单独资源字典中。 它与 App.xaml 资源字典中的其他资源字典合并。

运行代码没有产生任何错误,并且控件可见。我在其他机器上测试了应用程序,代码运行良好,我想指出这些机器是开发机器。

在客户端机器上测试应用程序(非开发)然后发现了一些奇怪的行为。自定义控件不可见;它只会在 3 台客户端计算机中的 1 台上可见。

我能够通过将模板放入“Themes\Generic.xaml”来解决问题。

我的问题是它如何能够在不必将模板放入 "Themes\Generic.xaml" 的情况下工作?我在谷歌上搜索过,但我可以找到任何明确的解释。

谢谢

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    要应用您的模板,它们需要存在于 Themes\Generic.xaml 中。 好消息是您可以在此处合并它们,我认为这是一种很好的做法,并且可以使您的代码更清晰。通常我的 generic.xaml 只包含这个,一个 X.Generic.xaml 供您所有的客户使用。控制。

    主题/Generic.xaml:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    ...>
        <!-- Your custom controls split into separate files -->
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/YourNamespace;component/Themes/ControlA.Generic.xaml" />
            <ResourceDictionary Source="/YourNamespace;component/Themes/ControlB.Generic.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    

    【讨论】:

    • 这正是我解决问题的方法,我真正好奇的是,在我的开发机器上它能够工作而不必将其放入“主题/通用” .xaml”。例如,我在“projectname.controls”下创建了一个名为“ControlA”的控件,模板将位于“resources/ControlADefault.xaml”下,然后它将合并到 App.xaml
    • 那么据我所知,您将不得不手动应用您的模板,为什么不简单地把它放在 Themes\Generic.xaml 中。你知道这句话的意义吗?你可能有几个主题。处理此问题的标准方法如上所述,如上所述,它允许您拥有不同的主题。 WPF 将扫描此文件/文件夹,这是处理此事的犹太教方式。
    • 是的,我明白了,这就是我目前的做法,它现在位于 Themes\Generic.xaml 中。但在我不知道我必须把它放在那里之前,我已经把它放在了一个不同的位置,它仍然有效。我只是好奇为什么它可以在某些机器上工作
    • 别这样! :) 为什么要逆流而上,做你不应该做的事情?您有几本描述其工作原理的好书。
    猜你喜欢
    • 2020-02-14
    • 2016-10-16
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多