ho un aggiornamento per 012.338.931 Soluzione. Funziona per risorse sia all'interno dello stesso dizionario risorse che in qualsiasi punto dell'applicazione.
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;
}
}
L'utilizzo è simile al precedente, ma la chiave è di usare Alias
come estensione di markup se utilizzati, non StaticResource
. Da qualche parte nella pila risorsa applicazione, definire le risorse ...
<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>
E ovunque si sta riferimento gli 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>
La mia soluzione necessaria referenziali, ma funziona per qualsiasi oggetto vuoi alias.
l'unica limitazione a questo è che non è possibile fare riferimento sia all'originale che all'alias se utilizzato all'interno dello stesso dizionario di risorse, poiché si sovrascriveranno l'un l'altro. sto assumendo che questo si applica a più dizionari si fondono allo scopo di applicazione. –
A giudicare dal modo in cui la domanda è formulata, non vuole fare riferimento all'originale - solo il suo alias. Il riferimento all'originale avrebbe vanificato lo scopo di creare l'alias. –
Questo funziona. Grazie! – Inferis