überprüfen Sie das folgende Szenario (andere können auch anwenden) [Sie das Projekt nur den Code hier auf der rechten Seite Datei einfügen Kopie erstellen]:Fehler im Visual Studio WPF-Designer?
a - ein Resource mit grundlegenden Sachen (Resources.xaml) anlegen:
<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>
b - erstellen Sie ein Benutzersteuerbasis, wo andere werden mit basischer Ressource (UserControlBase.cs) erben:
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) });
}
}
}
c - erstellen Sie ein Benutzersteuerelement von der Basis vererben (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>
Ergebnisse: StaticResources nicht aufgelöst werden (und der Test-BorderBrush nicht geladen). DynamicResources sind aufgelöst (der Hintergrund ist blau), aber der Designer sagt, dass er die Ressource trotzdem nicht finden kann (das erste Mal funktioniert in Ordnung, aber wenn Sie den Designer öffnen/schließen, kann die Ressource nicht aufgelöst werden). Nicht benannte Ressourcen wie der TextBlock-Stil funktionieren einwandfrei.
Ist das ein Designerfehler oder mache ich etwas falsch? Ist es in Ordnung, die Ressourcen in einem Szenario als dynamisch zu deklarieren, in dem sich die Ressourcen niemals ändern?
Vielen Dank im Voraus.
Es ist in Ordnung, Ressourcen als dynamisch zu deklarieren, nur nicht so effizient. Wenn Sie dieses ResourceDictionary nur hier verwenden, haben Sie versucht, es in 'UserControl.Resources' in einer XAML-Front für die Basisklasse hinzuzufügen, um festzustellen, ob es sich anders verhält? –
@WillEddins: In meiner realen Anwendung werden die Ressourcen auf einem Basis - UserControl gesetzt, so dass jedes Steuerelement über die erforderlichen Ressourcen verfügt, um es direkt im WPF - Designer anzuzeigen (andernfalls werden die Stile nur zur Laufzeit angewendet und wir können erst dann das richtige UI - Design erstellen) App bei jedem Wechsel: S). –