首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义控件主题在重建时消失。

自定义控件主题在重建时消失。
EN

Stack Overflow用户
提问于 2014-02-13 11:08:05
回答 1查看 162关注 0票数 1

我正忙着构建一个自定义控件。主题有一个Generic.xaml,它由一个引用两个资源字典(1 -泛型刷和2-ControlTemplate)的MergedDictionary组成,它们位于一个泛型文件夹中。

我在解决方案中添加了一个测试项目(标准窗口)来测试控件。

问题:当我第一次添加控件时,控件的外观看起来是正确的。但是,当我对控件进行一些更改并重新构建它时,控件将从窗口中消失,我必须卸载窗口项目并重新加载它,以使控件的外观再次出现。

当我运行调试器时,控件确实显示正确--只是在设计模式下,使用起来就变得困难了。

对于这种情况,是否有解决方案/解决办法,而不涉及在每次重建时卸载和重新加载窗口?

编辑

我已经运行了一个测试,在这个测试中,我将所有信息从不同的资源字典复制到Generic.Xaml中,并注释掉了合并字典。问题似乎不在于MergeDictionary操作,因为问题仍然存在--但可能与ComponentResourceKey /或静态属性有关。例如,我的一个ResourceDictionaries包含了许多以下内容

代码语言:javascript
复制
<SolidColorBrush x:Key="{x:Static keys:Disabled.ForeGroundKey}" Color="Gray"/>

其中ForeGroundKey链接到静态类,例如:

代码语言:javascript
复制
public static class Normal
{
    static ComponentResourceKey _background = new ComponentResourceKey(typeof(G2ListBox),"ContainerBackground");
    public static ComponentResourceKey BackGroundKey
    { get { return _background; } }
}

我猜想,主题工作有时意味着上面的方法没有什么问题,VS如何处理控件的重建也有问题。不过,我不明白的是为什么VS不承认旧值/新值,而忽略了与ComponentResourceKey - Ps链接的所有值。在运行时,控件完美地工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-13 15:56:30

看来我有三种选择。

  1. 使用我一直使用的方法:

代码语言:javascript
复制
- Define ComponentResourceKey in C# Class

公共静态类普通{静态ComponentResourceKey _background =新的ComponentResourceKey(typeof(G2ListBox),"Normal.Background");公共静态ComponentResourceKey BackGroundKey { get {返回_background;}}

-在资源字典中分配密钥

-在资源字典中使用密钥:

其优点是,当您有多个主题要分配和使用时,资源键看起来很简单,并且由于有了智能的帮助,在输入名称时出现错误的几率会降低。

缺点是,当您正在处理一个大型项目时,并且对您的控件做了一个小的调整--没有一个ComponentResourceKeys被加载,而且您的项目在设计时看起来完全没有外观。要解决此问题,必须重新启动VS或卸载使用您的控件的项目并重新加载它。Ps这只是在设计的时候。运行该项目将给出正确的结果。这是一个愚蠢的问题,在VS!

  1. 返回到在XAML中定义组件资源键的更详细的方法,即

代码语言:javascript
复制
- Define and Assign the resourceKey.

优点是VS现在每一次都在设计的时候工作。另外,您不必创建一个单独的C#类来保存所有的资源,缺点是您必须记住每个ResourceId的resourceId名称,并在定义它时输入它。同时,在具有多个主题的控件中使用此方法也会令人沮丧。

  1. 使用上述2种混合物,即

代码语言:javascript
复制
- You still Define the ResourceKey in C# library
- You Assing the ResourceKey as per method 2.  But the ResourceId is the "text" field assigned in the C# class and not the x:static method i.e.

公共静态类Normal {静态ComponentResourceKey _background =新的ComponentResourceKey(typeof(G2ListBox)," Normal.Background ");公共静态ComponentResourceKey BackGroundKey { get {返回_background;}}//分配//从而Normal.Background而不是Keys:Normal.Background!其中键=引用到C#类

-然后使用

//i.e .我们现在可以引用C#类并具有智能

它的优点是,1您有一个静态类,它保存了C#中的所有C#(稍微违背了无外观的哲学)。你也可以获得适当的智力,至少在使用方面是这样。但是最棒的是,VS在设计时工作得很好。然而,这根本不会缩短赋值方,因此,缺点仍然是您需要键入冗长的文本来为资源键分配颜色。拥有多个主题,每个主题都有自己的颜色集,这意味着您只会稍微缩短控件的样式,并且使用此方法似乎很傻。

因此,如果您想要最好的解决方案,而不关心设计时间,那么我更喜欢option1。如果你更喜欢设计时视觉效果,那么我会选择方法2,除非你必须在很多地方定义风格,那么选项3就足够了。或者创建一个设计时ResouceDictionary和一个编译时ResourceDictionary。在设计时使用方法3,编译时使用方法2,->不确定如何自动完成此操作。为此,我将使用合并字典,并在控件准备编译时取消对适当字典的注释,并删除设计时的ResourceDictionary。

希望这对某人有帮助,因为有一天我不得不花一整天的时间来解决这个问题(我认为我的控制有问题-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21752438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档