디자인 타임의 Windows 스토어 앱 ResourceLoader
-
20-12-2019 - |
문제
Windows 8.1용 Windows 스토어 앱을 만들기 시작했는데 현지화와 관련된 문제가 발생했습니다.
디자인 타임에 .resw 파일의 문자열 리소스를 표시하고 싶지만 런타임에 작동하더라도 모든 시도가 실패했습니다.
x:Uid 특성을 사용할 때 여전히 Text 속성을 제공해야 합니다(예:TextBlock의 경우) 텍스트를 두 번 쓰는 것을 좋아하지 않습니다.
또한 viewmodel에서 문자열에 대한 속성을 생성해 보았습니다.
public string Title
{
get { return ResourceLoader.GetForCurrentView("Strings").GetString("MainView_Title"); }
}
런타임에는 작동하지만 디자인 타임에는 비어 있습니다.
그렇다면 문제는 XAML 디자이너에서 .resw 파일의 리소스를 표시하는 방법이 있느냐는 것입니다.
보다 구체적으로 말하면 ResourceManager 클래스를 사용하면 디자인 타임에 .resw 파일을 읽을 수 있습니까?
도와 주셔서 감사합니다, Lucas
해결책
기존 방법
그래서, 당신이 할 수 있는 몇 가지 일이 있습니다.
첫 번째(그리고 가장 간단한, 사용 중인 경우) x:Uid
이미) 텍스트 필드에 텍스트를 제공하는 것입니다.그만큼 x:Uid
-관련 값은 거기에 있는 모든 것을 덮어씁니다.
<TextBlock Text="MyText" x:Uid="MainView_Title"/>
두 번째 방법은 이미 가지고 있는 속성을 사용한 다음 앱이 디자인 타임에 있는지 확인하고(몇 가지 다른 방법을 통해), 그렇다면 상수 값을 반환하고, 그렇지 않으면 리소스를 반환하는 것입니다.
public string Title
{
if(ViewModelBase.IsInDesignTimeStatic) //Mvvm Light's easy accessor
return "My Text";
return ResourceLoader.GetForCurrentView("Strings").GetString("MainView_Title");
}
이것이 도움이 되기를 바라며 즐거운 코딩을 하세요!
편집하다:적어도 Windows 8.1부터 이를 수행하는 새로운 방법이 있는 것으로 보입니다.
새로운 방법
- 다음을 참조하는 클래스를 만듭니다.
ResourceLoader
(위에서 설명한 속성과 유사) 문자열 키를 받아들이고 값을 반환하는 인덱싱된 속성 접근자를 만듭니다.
ResourceLoader
.public class LocalizedStrings { public string this[string key] { get { return App.ResourceLoader.GetForViewIndependentUse().GetString(key); } } }
당신의
App.xaml
, 정의StaticResource
이 유형의.<Application.Resources> <ResourceDictionary> <common:LocalizedStrings x:Key="Localized"/> </ResourceDictionary> </Application.Resources>
이제 출입키로 숙소에 출입하고 싶을 때 MainView_Title
, 이것을 사용하세요.좀 더 장황하지만 디자이너와 앱 자체 모두에서 번역되어야 합니다.
<TextBlock Text="{Binding Source={StaticResource Localized}, Path=[MainView_Title]}" />
원하는 경우 다음과 같이 좀 더 읽기 쉽게 섞을 수 있습니다.
<TextBlock Text="{Binding [MainView_Title], Source={StaticResource Localized}}" />
다른 팁
이것은 오래된 스레드이지만 Nate는 Win8.1에 대한 문제에 대한 우아한 솔루션을 제공했습니다. 나는 여기서 묻습니다.
많은 조사와 실험 이후, NATE의 솔루션은 VS2017 커뮤니티에서 Win10의 UWP 앱에서 작동하지 않습니다.LocalizedString 접근 방식은 런타임에 잘 작동하지만
가 나타납니다.App.ResourceLoader.GetForViewIndependentUse().GetString(key);
.
는 디자인 시간 동안 string.Empty를 제외하고 아무 것도 반환하는 것을 거부합니다.나는 많은 실험을했고
와 같은 것들이있었습니다.ResourceContext.GetForViewIndependentUse().QualifierValues
.
는 런타임 (작업)과 디자인 시간 (작동하지 않음)과 동일한 것처럼 보입니다.
누군가가 이것을 마주 쳤고 그것을 해결했는지 궁금해하고있었습니다.네이트?:)