2017-03-14 4 views
3

WPFウィンドウを定義して開こうとするroslynスクリプトを実行しています。とりわけWPF/XAML:任意の名前空間内で定義されていないクラスを参照する方法

、私のスクリプト

  1. が添付行動
  2. を定義するには、私はWPFウィンドウを作成するかに基づいてXAMLの文字列を定義します。このXAMLコードでは、スクリプトで定義されたTextBoxCursorPositionBehaviorを使用したいと考えています。

私のスクリプトは、(.csx)ファイルが

public class TextBoxCursorPositionBehavior : DependencyObject 
{ 
    // see http://stackoverflow.com/questions/28233878/how-to-bind-to-caretindex-aka-curser-position-of-an-textbox 
} 

public class MyGui 
{ 
    public void Show() 
    { 
     string xaml = File.ReadAllText(@"GUI_Definition.xaml"); 

     using (var sr = ToStream(xaml)) 
     { 
     System.Windows.Markup.ParserContext parserContext = new System.Windows.Markup.ParserContext(); 
     parserContext.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"); 
     parserContext.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml"); 
     parserContext.XmlnsDictionary.Add("i","clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"); 

     // ?? How can i define this properly? 
     parserContext.XmlnsDictionary.Add("behaviors", "clr-namespace:;assembly=" + typeof(TextBoxCursorPositionBehavior).Assembly.FullName); 

     var window = (System.Windows.Window)XamlReader.Load(sr, parserContext); 
     window.ShowDialog(); 
     } 
    } 
} 

に似およびGUI_Definition.xamlが

<Window x:Class="System.Windows.Window" Height="300" Width="300" > 
<Grid> 
    <!-- how can i attach my behavior here properly? --> 
    <TextBox behaviors:TextBoxCursorPositionBehavior.TrackCaretIndex="True"/> 
</Grid> 
</Window> 

のように見えます。しかし、問題は、私が正しくTextBoxCursorPositionBehavior参照する方法、であると仮定XAML?

Roslynはスクリプトファイル内で名前空間を使用できないため、TextBoxCursorPositionBehaviorを名前空間の外に定義する必要があります(つまり、グローバル名前空間に入ると仮定します)。

しかし、それをXAMLでどのように参照できますか?私は名前空間の参照を "clr-namespace:; assembly =" + typeof(TextBoxCursorPositionBehavior).ToString()で定義しようとしましたが、それは動作しません。 単に "clr-namespace:"(つまりアセンブリ参照なし)も機能しません。

XAML定義内からTextBoxCursorPositionBehaviorを参照する方法はありますか?あなたのコードの代わりに使用するアセンブリで

答えて

0

私は何が起こっているのか知っていると思います... RoslynはスクリプトのカスタムSubmissionタイプを作成し、TextBoxCursorPointerBehaviorの定義を含むすべてがこの提出タイプのサブクラスです。すなわち、

 var inst = new TextBoxCursorPositionBehavior(); 
     string typeName = inst.GetType().FullName; 

typeNameが "提出#0 + TextBoxCursorPositionBehavior" "TextBoxCursorPointerBehavior" ことではなくなります。

名前を正しく解析しないので、XAMLからこれを参照することはできません(例:振る舞い:Submission#0 + TextBoxCursorPositionBehavior.TrackCaretIndex = "True" 。

理論的には、Roslynの提出タイプをXAML経由で実際に参照可能なものに変更することは可能かもしれません。私の場合はそうすることはできません。残念ながら、現在、私はおそらく別のプリコンパイルされたDLLにこのコードをアウトソーシング以外の私の問題への解決策を、表示されていない(それは、スクリプトのいずれかのかなりのポイントではありません)を意味

+0

CSharpScript.Evaluateを使用して、スクリプトをどれだけ正確に実行していますか? – Evk

+0

私はSourceCodeKind = Scriptを使用してメモリ内アセンブリをコンパイルしています。サブミッションタイプを調べるか、ファクトリメソッドを自分で呼び出します。 これは、CSharpScript.Create()と.RunAsync()と比較してうまくいくはずです。特に、アセンブリの作成方法、サブミッションクラスの設定方法などはすべてRoslynのデフォルトですが、私はそこに干渉していません。 – Bogey

1

typeof(TextBoxCursorPositionBehavior).ToString() 

これは、アセンブリ名ではありません。それを変更します。

parserContext.XmlnsDictionary.Add("behaviors", "clr-namespace:;assembly=" + Assembly.GetExecutingAssembly().FullName); 

そして、それは正常に動作する必要があります(少なくとも私のために動作しますが、私はロザリンスクリプトが、普通のWPFアプリケーションをテストしていません)。

+0

私の悪い、編集しましたstackoverflowのサイズを縮小する私のスクリプトは、実際にあなたのコードと同じ結果/文字列を返した実際のスクリプトで正しいアセンブリ参照を持っていました。 興味深いのは、これは通常のプロジェクトであなたに役立ちます。これが本当にロザリンと関係があるのだろうかと思う。エラー:「不明なメンバーを設定できません」{clr-namespace:、assembly =ℛ* a195d238-7cf0-48ab-999f-2a6e28db1c13#125-0、Version = 0.0.0.0、Culture =ニュートラル、PublicKeyToken = null} TextBoxCursorPositionBehavior.TrackCaretIndex ' " – Bogey

+0

ああ、私は何がうまくいかないか考えていると思う。より多くのスペース/可視性のために以下に投稿します – Bogey

関連する問題