Visual Studio WPF设计器中的错误?

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样式这样的非命名资源可以正常工作.

这是设计师的错误还是我做错了什么?在资源永远不会改变的情况下,是否必须将资源声明为动态?

在此输入图像描述

提前致谢.

Wil*_*ins 1

设计人员似乎无法解决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无论设计时视图抛出“错误”或缺少红色边框,它都会在运行时按预期成功绑定(出现红色边框)。

我看到两个选择:

  1. DynamicResource在设计时必要时使用以解决这些问题。虽然您可以使用StaticResource,但相关的“错误”和缺乏设计时视图显然会成为问题。其他答案似乎表明两者现在可能没有太大的性能差异。

  2. 只需在您的 中实例化 ResourceDictionary UserControl.Resources,并且不要从基类继承。当您使用基类压缩一些代码时,您的效率并没有提高,因为ResourceDictionary每次都会创建一个新实例。由于您无法(据我所知)使用 XAML 前端从基类进行扩展,因此您可能会反对MergedDictionary在此抽象级别上使用未引用的对象。