2009-03-11 5 views
15

기존 SolidColorBrush (또는 다른 모든 리소스)을 재정의하거나 별칭을 지정하는 방법이 있습니까?WPF에서 리소스를 재정의하거나 별칭을 지정 하시겠습니까?

사례 : 원래의 키 대신 내 자신의 키로 참조하려는 외부 ResourceDictionary에 브러시가 있습니다. 나는 실제 브러시가 미래에 변하기 쉽기 때문에 외부 참조에 의존하기를 원하지 않는다. 실제 브러시가 미래에 변화하는 경향이 있기 때문에

답변

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 키가있는 Color의 별칭이고 "잘못된 자원 유형입니다. 예상되는 유형은 'Color' '별칭'입니다. " –

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

내 솔루션은 문자열을 참조해야하지만, 어떤 개체에 대한 작업 당신은 별칭을 원합니다.

관련 문제