2009-03-11 16 views
15

क्या मौजूदा SolidColorBrush (या वास्तव में कोई अन्य संसाधन, वास्तव में) को फिर से परिभाषित करने के लिए कोई तरीका है?WPF में एक संसाधन को फिर से परिभाषित/उपनाम?

बिंदु में मामला: मेरे पास बाहरी संसाधन डिक्शनरी में एक ब्रश है जिसे मैं मूल कुंजी के बजाय अपनी कुंजी से संदर्भित करना चाहता हूं। मैं बाहरी संदर्भ पर निर्भर नहीं होना चाहता, क्योंकि वास्तविक ब्रश भविष्य में बदलने के लिए प्रवण है।

उत्तर

13
<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <SolidColorBrush x:Key="SomeExternalResource">Red</SolidColorBrush> 
    </Window.Resources> 
    <Grid> 
     <Grid.Resources> 
      <StaticResourceExtension ResourceKey="SomeExternalResource" x:Key="SomeAliasedResource"/> 
     </Grid.Resources> 

     <Border Background="{StaticResource SomeAliasedResource}"/> 
    </Grid> 
</Window> 

मैं करते हैं, बाहरी संदर्भ पर निर्भर नहीं रहना चाहती क्योंकि वास्तविक ब्रश भविष्य में बदल की संभावना है।

आप अभी भी बाहरी संसाधनों पर निर्भर रहेंगे, बस कई जगहों पर नहीं।

+0

इस के लिए एकमात्र सीमा यह है कि यदि आप एक ही संसाधन शब्दकोश के भीतर उपयोग किए जाते हैं तो आप मूल और उपनाम दोनों का संदर्भ नहीं दे सकते हैं, क्योंकि वे एक-दूसरे को ओवरराइड करेंगे। मुझे लगता है कि यह कई प्रकार के शब्दकोशों पर लागू होता है जो आप एप्लिकेशन स्कोप पर विलय करते हैं। –

+0

प्रश्न के तरीके के आधार पर निर्णय लेते हुए, वह मूल - केवल उसके उपनाम का संदर्भ नहीं लेना चाहता। मूल का संदर्भ उपनाम बनाने के उद्देश्य को हरा देगा। –

+0

यह काम करता है। धन्यवाद! – Inferis

4

आप StaticResourceExtension tuse के लिए कोशिश कर सकते हैं, लेकिन संसाधन वैश्विक शब्दकोशों में यह काम नहीं करता (अजीब संकलक और क्रम त्रुटियों):

:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 

    <SolidColorBrush x:Key="StatusColor_OK" Color="#ff32a248" /> 
    <StaticResourceExtension 
     x:Key="AliasKey" 
     ResourceKey="StatusColor_Error" /> 
</ResourceDictionary> 

इस समस्या को दूर करने के लिए, मैं निम्नलिखित श्रेणी का निर्माण

/// <summary> 
/// Defines an Alias for an existing resource. Very similar to 
/// <see cref="StaticResourceExtension"/>, but it works in 
/// ResourceDictionaries 
/// </summary> 
public class Alias: System.Windows.Markup.MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     IRootObjectProvider rootObjectProvider = (IRootObjectProvider) 
      serviceProvider.GetService(typeof (IRootObjectProvider)); 
     if (rootObjectProvider == null) return null; 
     IDictionary dictionary = rootObjectProvider.RootObject as IDictionary; 
     if (dictionary == null) return null; 
     return dictionary[ResourceKey]; 
    } 


    public object ResourceKey { get; set; } 
} 

उपयोग:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 

    <SolidColorBrush x:Key="StatusColor_OK" Color="#ff32a248" /> 
    <Alias 
     x:Key="AliasKey" 
     ResourceKey="StatusColor_Error" /> 
</ResourceDictionary> 
+0

अगर मैं उपनाम का उपयोग करने की कोशिश करता हूं ... उदा। जहां MyOtherColor कुंजी MyColor के साथ रंग के लिए उपनाम है, तो यह शिकायत करता है और कहता है "अमान्य संसाधन प्रकार: अपेक्षित प्रकार 'रंग', वास्तविक प्रकार है 'उपनाम' है "। –

+0

स्पष्टीकरण के लिए, यह काम करता है अगर उपनाम संसाधन शब्दकोश में है, और उपनाम उस शब्दकोश के बाहर उपयोग किया जाता है। हालांकि इसका उपयोग उसी शब्दकोश में नहीं किया जा सकता है। –

+0

और मेरी मूल टिप्पणी के अनुसार नकली त्रुटियां उठाई गई हैं और गायब हो गई हैं। यदि मैं ऐप को सफलतापूर्वक चलाता हूं, तो व्हाइटस्पेस जोड़कर XAML को संपादित करें, एक कंपाइलर त्रुटि प्रकट होती है।मैं परियोजना का निर्माण करता हूं, यह अभी भी वहां है। मैं फिर से निर्माण करता हूं, यह गायब हो जाता है। यह बहुत निराशाजनक है क्योंकि आपका विचार इतना आशाजनक लग रहा था! –

2

मैं 012,338,931 के लिए एक अद्यतन हैसमाधान। यह संसाधनों के लिए समान संसाधन शब्दकोश और एप्लिकेशन के भीतर कहीं भी संसाधनों के लिए काम करता है।

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; 
    } 
} 

उपयोग ऊपर करने के लिए समान है, लेकिन कुंजी है, जहां इस्तेमाल नहीं किया StaticResource मार्कअप विस्तार के रूप में Alias उपयोग करने के लिए है। आवेदन संसाधन ढेर में कहीं न कहीं, संसाधनों को परिभाषित ...

<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> 

और भी आप उपनाम संदर्भित कर रहे हैं ...

<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> 

मेरे समाधान तार संदर्भित की आवश्यकता है, लेकिन यह किसी भी वस्तु के लिए काम करता है आप उपनाम करना चाहते हैं।

संबंधित मुद्दे