tengo una actualización de 012.338.solución. Esto funciona para recursos dentro del mismo diccionario de recursos y en cualquier lugar dentro de la aplicación.
public class Alias : MarkupExtension
{
public string ResourceKey { get; set; }
public Alias()
{
}
public Alias(string resourceKey)
{
ResourceKey = resourceKey;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return _ProvideLocalValue(serviceProvider) ?? _ProvideApplicationValue();
}
private object _ProvideLocalValue(IServiceProvider serviceProvider)
{
var rootObjectProvider = (IRootObjectProvider)
serviceProvider.GetService(typeof(IRootObjectProvider));
if (rootObjectProvider == null) return null;
var dictionary = rootObjectProvider.RootObject as IDictionary;
if (dictionary == null) return null;
return dictionary.Contains(ResourceKey) ? dictionary[ResourceKey] : null;
}
private object _ProvideApplicationValue()
{
var value = Application.Current.TryFindResource(ResourceKey);
return value;
}
}
El uso es similar al anterior, pero la clave es usar Alias
como la extensión de marcado cuando se usa, no StaticResource
. En algún lugar de la pila de recursos de aplicaciones, definir los recursos ...
<Application x:Class="WPF.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:wpf="clr-namespace:WPF"
StartupUri="MainWindow.xaml">
<Application.Resources>
<system:String x:Key="Text">Display some text.</system:String>
<system:String x:Key="Other">4</system:String>
<wpf:Alias x:Key="Alias" ResourceKey="Text"/>
<wpf:Alias x:Key="Second" ResourceKey="Other"/>
</Application.Resources>
</Application>
Y donde quiera que estés referencia a los alias ...
<Window x:Class="WPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpf="clr-namespace:WPF"
Title="MainWindow" Height="150" Width="300">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="{wpf:Alias Alias}"/>
<TextBlock Text="{wpf:Alias Second}"/>
</StackPanel>
</Window>
Mi solución requiere hacer referencia a las cadenas, pero funciona para cualquier objeto quieres alias
la única limitación es que no se puede hacer referencia tanto al original como al alias si se utilizan en el mismo diccionario de recursos, ya que se anularán entre sí. supongo que esto se aplica a varios diccionarios que se fusionan en el ámbito de la aplicación. –
A juzgar por la forma en que está formulada la pregunta, él no quiere hacer referencia al original, solo su alias. Hacer referencia al original vencería el propósito de crear el alias. –
Eso funciona. ¡Gracias! – Inferis