Sprawdź następujący scenariusz (inni mogą mieć zastosowanie również) [można utworzyć projekt po prostu skopiować wkleić kod tutaj po prawej pliku]:Błąd w projektancie Visual Studio WPF?
a - Tworzenie ResourceDictionary z podstawowe rzeczy (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>
b - Tworzenie bazy kontroli użytkownika, gdzie inni będą dziedziczyć zawierający podstawowe zasoby (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) });
}
}
}
c - Tworzenie UserControl dziedziczenie z podstawy (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>
Wyniki: StaticResources nie zostały rozwiązane (a BorderBrush testowy nie jest załadowany). DynamicResources są rozwiązywane (tło jest niebieskie), ale projektant mówi, że i tak nie może znaleźć zasobu (pierwszy raz działa dobrze, ale kiedy otwierasz/zamykasz projektanta, nie można rozwiązać zasobu). Zasoby niewymienione, takie jak styl TextBlock, działają poprawnie.
Czy to błąd projektanta, czy też robię coś nie tak? Czy dobrze jest zadeklarować zasoby jako dynamiczne w scenariuszu, w którym zasoby nigdy się nie zmienią?
góry dzięki.
Zgadzam się, aby zasoby były dynamiczne, ale nie tak wydajne. Jeśli używasz tego ResourceDictionary tylko tutaj, czy próbowałeś dodać go w 'UserControl.Resources' w przód XAML dla klasy bazowej, aby zobaczyć, czy zachowuje się inaczej? –
@WillEddins: w mojej prawdziwej aplikacji zasoby są ustawione na podstawowym UserControl, więc każda kontrolka ma wymagane zasoby, aby zobaczyć je bezpośrednio na projektorze WPF (w przeciwnym razie style są stosowane tylko w środowisku wykonawczym i nie możemy wykonać właściwego projektu interfejsu użytkownika, chyba że uruchomimy aplikacja dla każdej zmiany: S). –