기존 SolidColorBrush
(또는 다른 모든 리소스)을 재정의하거나 별칭을 지정하는 방법이 있습니까?WPF에서 리소스를 재정의하거나 별칭을 지정 하시겠습니까?
사례 : 원래의 키 대신 내 자신의 키로 참조하려는 외부 ResourceDictionary에 브러시가 있습니다. 나는 실제 브러시가 미래에 변하기 쉽기 때문에 외부 참조에 의존하기를 원하지 않는다. 실제 브러시가 미래에 변화하는 경향이 있기 때문에
기존 SolidColorBrush
(또는 다른 모든 리소스)을 재정의하거나 별칭을 지정하는 방법이 있습니까?WPF에서 리소스를 재정의하거나 별칭을 지정 하시겠습니까?
사례 : 원래의 키 대신 내 자신의 키로 참조하려는 외부 ResourceDictionary에 브러시가 있습니다. 나는 실제 브러시가 미래에 변하기 쉽기 때문에 외부 참조에 의존하기를 원하지 않는다. 실제 브러시가 미래에 변화하는 경향이 있기 때문에
<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>
나는 외부 참조에 의존하고 싶지 않아요.
외부 리소스에 의존 할 수는 있지만 많은 곳이 아닙니다.
당신은 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>
별칭을 어딘가에서 사용하려고하면 ...
별칭이 리소스 사전에 있고 별칭이 해당 사전 외부에서 사용되는 경우 명확하게하기 위해 별칭이 작동합니다. 그러나 같은 사전 내에서 사용할 수는 없습니다. –
그리고 원래의 코멘트에 따라 가짜 오류가 제기되고 사라집니다. 응용 프로그램을 성공적으로 실행 한 다음 공백을 추가하여 XAML을 편집하면 컴파일러 오류가 나타납니다.나는 프로젝트를 건설한다, 그것은 아직도 거기에있다. 나는 다시 건축한다, 그것은 사라진다. 아이디어가 너무 유망 해 보였기 때문에 매우 실망 스럽습니다! –
나는 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>
내 솔루션은 문자열을 참조해야하지만, 어떤 개체에 대한 작업 당신은 별칭을 원합니다.
유일한 제한 사항은 동일한 리소스 사전 내에서 사용되는 경우 원본과 별칭을 모두 참조 할 수 없다는 것입니다. 서로 겹치기 때문입니다. 이 응용 프로그램 범위에서 병합 여러 사전에 적용 할 가정합니다. –
질문의 표현 방식에 따라 판단 할 때, 그는 자신의 별칭만을 언급하고 싶지 않습니다. 원본을 참조하면 별칭을 만들 목적이 없습니다. –
그게 작동합니다. 감사! – Inferis