ich eine Markup-Erweiterung für WPF geschrieben habe, die michDesign-Zeitprüfung von Markup-Erweiterung Argumenten in WPF-Designer
<!-- Generic Styles -->
<Style x:Key="bold" TargetType="Label">
<Setter Property="FontWeight" Value="ExtraBold" />
</Style>
<Style x:Key="italic" TargetType="Label">
<Setter Property="FontStyle" Value="Italic" />
</Style>
<Style x:Key="gridHeader" TargetType="Label"
BasedOn="{WPF:CombiStyle bold italic }" >
Es ist eine sehr nützliche Erweiterung erlaubt, zu tun und es funktioniert zur Laufzeit groß. Allerdings zur Entwurfszeit kann ich nicht die Stile angezeigt, dass oder wenn ich falsch und kursiv falsch eingeben sie nicht als StaticResources gefunden werden kann.
Irgendwelche Hacks, die ich tun kann, damit das funktioniert?
Der Quellcode für die Erweiterung ist
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Markup;
namespace MarkupExtensions
{
[MarkupExtensionReturnType(typeof(Style))]
public class CombiStyleExtension : MarkupExtension
{
private string[] MergeStyleProviders { get; set; }
public CombiStyleExtension(string s0)
{
MergeStyleProviders = s0.Split(new[]{' '});
}
public override object ProvideValue(IServiceProvider
serviceProvider)
{
return MergeStyleProviders
.Select(x => StringToStyle(serviceProvider, x))
.Aggregate(new Style(), RecursivelyMergeStyles);
}
private static Style StringToStyle(IServiceProvider serviceProvider, string x)
{
var style = new StaticResourceExtension() { ResourceKey = x }.ProvideValue(serviceProvider) as Style;
if (style==null)
{
throw new ArgumentException("Argument could not be converted to a style");
}
return style;
}
private static Style RecursivelyMergeStyles(Style accumulator,
Style next)
{
if (next.BasedOn != null)
{
RecursivelyMergeStyles(accumulator, next.BasedOn);
}
MergeStyle(accumulator, next);
return accumulator;
}
private static void MergeStyle(Style targetStyle, Style sourceStyle)
{
targetStyle.TargetType = sourceStyle.TargetType;
// Merge the Setters...
foreach (var setter in sourceStyle.Setters)
targetStyle.Setters.Add(setter);
// Merge the Triggers...
foreach (var trigger in sourceStyle.Triggers)
targetStyle.Triggers.Add(trigger);
}
}
}
Excellent. Dies sind die Dinge, die Microsoft hätte tun sollen, anstatt das WheelRT neu zu erfinden. –
Hmmmm +5 auf die Frage und keine Antworten. Etwas, das jeder gerne tun möchte, aber nicht möglich ist! – bradgonesurfing
Ja, ich würde gerne Ihre Erweiterung verwenden! –