XAML에서 자신의 클래스 이름을 얻는 MarkupExtension
3558 단어 VisualStudio.NETWPFXamlC#
개요
XAML만으로 자신의 클래스 이름을 얻는 MarkupExtension의 설명입니다.
예를 들어 MainWindow.xaml 내에 있으면 "MainWindow"라는 문자열을 자동으로 얻을 수 있습니다.
코드(C#)로 쓰면 this.GetType().Name
입니다만, XAML만으로 하는 방법이 간단하게는 모르기 때문에 소개합니다.
사용방법
Window의 Title과 내부의 TextBlock에 후술하는 MarkupExtension를 지정합니다.
MainWindow.xaml<Window
x:Class="WpfApp3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp3"
Width="300" Height="100"
Title="{local:RootName}" >
<TextBlock Text="{local:RootName}"/>
</Window>
결과
직접 문자열로 지정하지 않아도 "MainWindow"가 표시됩니다.
MarkupExtension 구현
RootNameExtension.cs[MarkupExtensionReturnType(typeof(string))]
public class RootNameExtension : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
var provideValueTarget = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
var rootObj = provideValueTarget?.RootObject;
return rootObj?.GetType().Name;
}
}
주의점
디자이너 때에는 반영되지 않습니다.
이는 런타임과 디자인 타임에 serviceProvider가 다르기 때문입니다.
환경
VisualStudio2017
.NET Framework 4.6
C#6
Reference
이 문제에 관하여(XAML에서 자신의 클래스 이름을 얻는 MarkupExtension), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/soi/items/0b5535f7365667de568b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Window의 Title과 내부의 TextBlock에 후술하는 MarkupExtension를 지정합니다.
MainWindow.xaml
<Window
x:Class="WpfApp3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp3"
Width="300" Height="100"
Title="{local:RootName}" >
<TextBlock Text="{local:RootName}"/>
</Window>
결과
직접 문자열로 지정하지 않아도 "MainWindow"가 표시됩니다.
MarkupExtension 구현
RootNameExtension.cs[MarkupExtensionReturnType(typeof(string))]
public class RootNameExtension : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
var provideValueTarget = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
var rootObj = provideValueTarget?.RootObject;
return rootObj?.GetType().Name;
}
}
주의점
디자이너 때에는 반영되지 않습니다.
이는 런타임과 디자인 타임에 serviceProvider가 다르기 때문입니다.
환경
VisualStudio2017
.NET Framework 4.6
C#6
Reference
이 문제에 관하여(XAML에서 자신의 클래스 이름을 얻는 MarkupExtension), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/soi/items/0b5535f7365667de568b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
RootNameExtension.cs
[MarkupExtensionReturnType(typeof(string))]
public class RootNameExtension : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
var provideValueTarget = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
var rootObj = provideValueTarget?.RootObject;
return rootObj?.GetType().Name;
}
}
주의점
디자이너 때에는 반영되지 않습니다.
이는 런타임과 디자인 타임에 serviceProvider가 다르기 때문입니다.
환경
VisualStudio2017
.NET Framework 4.6
C#6
Reference
이 문제에 관하여(XAML에서 자신의 클래스 이름을 얻는 MarkupExtension), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/soi/items/0b5535f7365667de568b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
VisualStudio2017
.NET Framework 4.6
C#6
Reference
이 문제에 관하여(XAML에서 자신의 클래스 이름을 얻는 MarkupExtension), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/soi/items/0b5535f7365667de568b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)