none
Schachtelung in MarkupExtension RRS feed

  • Frage

  • Hallo,

    ich habe MarkupExtension, die wunderbar funktioniert, wenn man im XAML die Werte direkt zwischen den {} angibt.

    Wenn ich für einen Wert auf eine StaticResource verweisen möchte, zeigt der WPF-Designer das Resultat fehlerfrei an. Der Compiler jedoch erzeugt den Fehler:

    Fehler 1 Beim Analysieren einer Markup Extension wurde für den Typ "MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension" die unbekannte Eigenschaft "P0" gefunden. Zeile 14 Position 14. D:\VS 2012 Express\MyProjects\Test\MarkupGeschachtelt\MarkupGeschachtelt\MainWindow.xaml 14 14 MarkupGeschachtelt

    Laut MSDN-Doku werden geschachtelte MarkupExtensions unterstützt, funktioniert z.B. auch bei {Binding RelativeSource={...}}.

    Fehlt da noch was?

    <Window x:Class="MarkupGeschachtelt.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    		xmlns:sys="clr-namespace:System;assembly=mscorlib"
    		xmlns:mySpace="clr-namespace:MarkupGeschachtelt"
            Title="MainWindow" Height="350" Width="525">
    
    	<Window.Resources>
    		<sys:String x:Key="Firstname">Egon</sys:String>
    		<sys:Int32 x:Key="Age">99</sys:Int32>
    	</Window.Resources>
    
    	<StackPanel>
    		<TextBlock Text="{mySpace:StrFmt Format='Er heißt {0} und ist {1} Jahre alt.',
    										 P0={StaticResource Firstname}, P1={StaticResource Age}}" />
    
    		<TextBlock Text="{mySpace:StrFmt Format='Er heißt {0} und ist {1} Jahre alt.',
    										 P0=Anton, P1=55}" />
    	</StackPanel>
    </Window>
    
    using System;
    using System.Windows.Markup;
    
    namespace MarkupGeschachtelt
    {
    	[MarkupExtensionReturnType(typeof(string))]
    	public class StrFmt : MarkupExtension
    	{
    		public string Format { get; set; }
    		public object P0 { get; set; }
    		public object P1 { get; set; }
    
    		public StrFmt()
    		{}
    
    		public StrFmt(string format, object p0)
    			: this(format, p0, null)
    		{}
    
    		public StrFmt(string format, object p0, object p1)
    		{
    			Format = format;
    			P0 = p0;
    			P1 = p1;
    		}
    
    		public override object ProvideValue(IServiceProvider serviceProvider)
    		{
    			if (Format == null)
    				return "";
    
    			return String.Format(Format, P0, P1);
    		}
    	}
    }
    

    Heiko

    Dienstag, 2. Dezember 2014 12:41

Antworten

Alle Antworten