我正忙着构建一个自定义控件。主题有一个Generic.xaml,它由一个引用两个资源字典(1 -泛型刷和2-ControlTemplate)的MergedDictionary组成,它们位于一个泛型文件夹中。
我在解决方案中添加了一个测试项目(标准窗口)来测试控件。
问题:当我第一次添加控件时,控件的外观看起来是正确的。但是,当我对控件进行一些更改并重新构建它时,控件将从窗口中消失,我必须卸载窗口项目并重新加载它,以使控件的外观再次出现。
当我运行调试器时,控件确实显示正确--只是在设计模式下,使用起来就变得困难了。
对于这种情况,是否有解决方案/解决办法,而不涉及在每次重建时卸载和重新加载窗口?
编辑
我已经运行了一个测试,在这个测试中,我将所有信息从不同的资源字典复制到Generic.Xaml中,并注释掉了合并字典。问题似乎不在于MergeDictionary操作,因为问题仍然存在--但可能与ComponentResourceKey /或静态属性有关。例如,我的一个ResourceDictionaries包含了许多以下内容
<SolidColorBrush x:Key="{x:Static keys:Disabled.ForeGroundKey}" Color="Gray"/>其中ForeGroundKey链接到静态类,例如:
public static class Normal
{
static ComponentResourceKey _background = new ComponentResourceKey(typeof(G2ListBox),"ContainerBackground");
public static ComponentResourceKey BackGroundKey
{ get { return _background; } }
}我猜想,主题工作有时意味着上面的方法没有什么问题,VS如何处理控件的重建也有问题。不过,我不明白的是为什么VS不承认旧值/新值,而忽略了与ComponentResourceKey - Ps链接的所有值。在运行时,控件完美地工作。
发布于 2014-02-13 15:56:30
看来我有三种选择。
- Define ComponentResourceKey in C# Class公共静态类普通{静态ComponentResourceKey _background =新的ComponentResourceKey(typeof(G2ListBox),"Normal.Background");公共静态ComponentResourceKey BackGroundKey { get {返回_background;}}
-在资源字典中分配密钥
-在资源字典中使用密钥:
其优点是,当您有多个主题要分配和使用时,资源键看起来很简单,并且由于有了智能的帮助,在输入名称时出现错误的几率会降低。
缺点是,当您正在处理一个大型项目时,并且对您的控件做了一个小的调整--没有一个ComponentResourceKeys被加载,而且您的项目在设计时看起来完全没有外观。要解决此问题,必须重新启动VS或卸载使用您的控件的项目并重新加载它。Ps这只是在设计的时候。运行该项目将给出正确的结果。这是一个愚蠢的问题,在VS!
- Define and Assign the resourceKey.优点是VS现在每一次都在设计的时候工作。另外,您不必创建一个单独的C#类来保存所有的资源,缺点是您必须记住每个ResourceId的resourceId名称,并在定义它时输入它。同时,在具有多个主题的控件中使用此方法也会令人沮丧。
- 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。
希望这对某人有帮助,因为有一天我不得不花一整天的时间来解决这个问题(我认为我的控制有问题-)
https://stackoverflow.com/questions/21752438
复制相似问题