Ign*_*cia 6 .net wpf resources designer visual-studio-2010
检查以下场景(其他可能也适用)[您可以创建项目,只需在右侧文件中复制粘贴代码]:
a - 使用基本内容创建ResourceDictionary(Resources.xaml):
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush Color="Red" x:Key="Test" />
<Style TargetType="{x:Type GroupBox}" x:Key="Test2" >
<Setter Property="Background" Value="Blue" />
</Style>
<Style TargetType="{x:Type TextBlock}" >
<Setter Property="Foreground" Value="Green" />
</Style>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
b - 创建一个用户控制库,其他人将继承包含基本资源的用户控制库(UserControlBase.cs):
using System.Windows.Controls;
using System;
using System.Windows;
namespace ResourceTest
{
public class UserControlBase : UserControl
{
public UserControlBase()
{
this.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("ResourceTest;component/Resources.xaml", UriKind.RelativeOrAbsolute) });
}
}
}
Run Code Online (Sandbox Code Playgroud)
c - 创建从基础继承的UserControl(UserControl1.xaml):
<ResourceTest:UserControlBase x:Class="ResourceTest.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ResourceTest="clr-namespace:ResourceTest"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="300" >
<Grid>
<GroupBox BorderBrush="{StaticResource Test}" Margin="3" Header="Test" Style="{DynamicResource Test2}" >
<TextBlock Text="TESTTEST" />
</GroupBox>
</Grid>
</ResourceTest:UserControlBase>
Run Code Online (Sandbox Code Playgroud)
结果:未解析StaticResources(并且未加载Test BorderBrush).DynamicResources已解决(背景为蓝色),但设计师表示无论如何都无法找到资源(第一次正常工作,但是当您打开/关闭设计器时,资源无法解析).像TextBlock样式这样的非命名资源可以正常工作.
这是设计师的错误还是我做错了什么?在资源永远不会改变的情况下,是否必须将资源声明为动态?

提前致谢.
设计人员似乎无法解决MergedDictionaries设计时在代码隐藏中定义的问题。
ResourceDictionary一个更糟糕的例子可以通过将 移到初始化之前来看到。
public UserControl1()
{
this.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("TempProject;component/Resources.xaml", UriKind.RelativeOrAbsolute) });
InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,事件DynamicResource在设计时无法解析,这表明设计时视图不一定像您期望的那样调用构造函数。我使用 Visual Studio 2012 对此进行了测试,因此自 2010 年以来此行为没有改变。
就原始测试代码而言,请注意,StaticResource无论设计时视图抛出“错误”或缺少红色边框,它都会在运行时按预期成功绑定(出现红色边框)。
我看到两个选择:
DynamicResource在设计时必要时使用以解决这些问题。虽然您可以使用StaticResource,但相关的“错误”和缺乏设计时视图显然会成为问题。其他答案似乎表明两者现在可能没有太大的性能差异。
只需在您的 中实例化 ResourceDictionary UserControl.Resources,并且不要从基类继承。当您使用基类压缩一些代码时,您的效率并没有提高,因为ResourceDictionary每次都会创建一个新实例。由于您无法(据我所知)使用 XAML 前端从基类进行扩展,因此您可能会反对MergedDictionary在此抽象级别上使用未引用的对象。
| 归档时间: |
|
| 查看次数: |
1770 次 |
| 最近记录: |