C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

XAMLのマークアップ拡張の指定方法

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■93695 / inTopicNo.1)  XAMLのマークアップ拡張の指定方法
  
□投稿者/ たまじろ (1回)-(2020/01/14(Tue) 11:15:53)

分類:[C#] 

以下のXAMLでConverter={StaticResource DegToRad}としていますが
Converter={NewInstance local:DegreeToRadianConverter}
のように直接指定することはできないのでしょうか。
Converter={local:DegreeToRadianConverter}ではインスタンスを生成できないのでそのような定義になるのではと考えています。
マークアップ拡張にクラスを指定する場合は必ずStaticResourceの参照を行わなければならないのでしょうか。

<StackPanel xmlns:local="clr-namespace:atmarkit05">

  <StackPanel.Resources>
    <local:DegreeToRadianConverter x:Key="DegToRad"/>
  </StackPanel.Resources>

  <Slider x:Name="slider" Value="0" Minimum="0" Maximum="360" />
  <TextBox Text="{Binding ElementName=slider, Path=Value, Converter={StaticResource DegToRad}}" />

</StackPanel>

よろしくお願いします。

引用返信 編集キー/
■93696 / inTopicNo.2)  Re[1]: XAMLのマークアップ拡張の指定方法
□投稿者/ Hongliang (950回)-(2020/01/14(Tue) 12:38:54)
public class InstanceProvider : MarkupExtension {
  public InstanceProvider(Type type) {
    this.m_Type = type;
  }
  private Type m_Type;
  public override object ProvideValue(IServiceProvider serviceProvider) {
    return Activator.CreateInstance(this.m_Type);
  }
}
こういうマークアップ拡張を書けば、
Converter={local:InstanceProvider {x:Type local:HogeConverter}}
のように記述できます。
(もちろん、HogeConverterがデフォルトコンストラクタを持っている必要あり)

あるいは、
public class HogeConverter : MarkupExtension, IValueConverter {
  public object Convert(略) { return value; }
  public object ConvertBack(略) { return value; }
  public override object ProvideValue(IServiceProvider serviceProvider) {
    return this;
  }
}
このようにコンバータにマークアップ拡張機能も追加すれば、
Converter={local:HogeConverter}
のように記述できます。

状態を持たない(引数とかで振る舞いが変わらない)コンバータであれば
StaticResourceにするのが性能的に良いんじゃないかとは思いますが。

引用返信 編集キー/
■93697 / inTopicNo.3)  Re[2]: XAMLのマークアップ拡張の指定方法
□投稿者/ たまじろ (2回)-(2020/01/14(Tue) 16:22:30)
2020/01/14(Tue) 16:22:54 編集(投稿者)

ありがとうございます。
色々頂いたサンプルでとても勉強になりました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ