-1

WPFを学べるように画面上にXAML指定のインターフェースを取得したい。しかし、すべての配線がすでに完了しているビジュアル スタジオ プロジェクトから始めたくありません。「main()」関数から画面上の xaml ファイルで指定されたウィンドウを描画することと同等の c# の「hello world」は必要ありません。

では、XAML ファイルをオブジェクトに関連付けて、コンソール アプリから画面に描画するにはどうすればよいでしょうか。簡単なイベントも配線してください。「hello world」ボタン (xaml で指定) を言います。これを押すと、コンソールに「hello world」が出力されます。次の方法でデリゲート関数を確認したいと思います。

  1. XAML のインライン c# としてのロジック。
  2. フリー関数として「main()」メソッドと同じファイルで指定されたロジック (編集: 待って、c# にはフリー関数がなく、コード ビハインドではないある種のデリゲート)。
  3. オブジェクトのメンバー関数としてのロジック。オブジェクトは XAML のコード ビハインドであると考えられます (もちろん、この方法で xaml と c# オブジェクト間のマッピングが可能であると仮定します)。

さらに:この回答は、ui runloop がメインスレッドを引き継いでいることを示しています。呼び出し先をブロックしないように、アプリの新しいスレッドを作成するための砂糖はありますか?

なぜ私がこの質問をするのか、またはなぜこのように WPF を学びたいのか疑問に思っている場合。他に情報を表示する手段がないプラグイン内からアドホック UI 要素をトリガーしたいと考えています。


この質問があいまいすぎると思う人のために、xaml の例を次に示します。

<Canvas xmlns="http://schemas.microsoft.com/client/2007"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <TextBlock>Hello World!</TextBlock>
</Canvas>

この質問のメイン アプリはコンソール c# アプリです。XAML ファイルは単一のボタンを持つフォームを表し、ボタンを押すとコンソールに "hello world" が出力されます。そして、ボタンをコードに接続するさまざまな方法を見たいのですが、どうすればより明確になるかわかりません。

4

2 に答える 2

4

これはあなたが尋ねたものではないと言われるリスクがありますが、明確ではないため:

class WpfSample
{
    [STAThread]
    public static void Main()
    {
        var window = new Window()
        {
            Title = "WPF",
            Width = 640,
            Height = 480
        };

        var grid = new Grid();

        var button = new Button()
        {
            Content = "Click Me",
            Width = 100,
            Height = 50,

        };

        grid.Children.Add(button);
        window.Content = grid;

        button.Click += (s, e) =>
        {
            MessageBox.Show("You clicked me");
        };

        window.ShowDialog();

    }
}

そうは言っても、WPF アプリケーションのプラグインが必要な場合、このように (すべてコードで) 行うのは適切ではありません。

コードですべてをフックする必要なく、プラグインでそのようなコントロールを定義します。そのために MEF を使用します。

更新 どこかに保存した XAML から UI をロードするには、ValueConverter を使用できます。

public class StringToXamlValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string xaml;
        if (value != null && !String.IsNullOrWhiteSpace(value.ToString))
        {
            xaml = value.ToString();
        }
        else
        {
            xaml = Settings.Default.DefaultLayoutView;
        }

        var root = XamlReader.Parse(xaml);
        return root;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

次に、次のような要素のコンテンツを設定します。

<ContentControl Content="{Binding Layout.View, Converter={StaticResource StringToXamlConverter}}"/>
于 2012-12-05T02:34:16.507 に答える
1

要点を簡単に説明すると、次のようになります。

他に情報を表示する手段がないプラグイン内からアドホック UI 要素をトリガーしたいと考えています。

ウィンドウを最初から描画する必要はまったくありません。代わりに、オブジェクトでShowDialog()メソッドを使用できます。Window

var myWindow = new Window();
myWindow.ShowDialog();

もちろん、そのウィンドウに必要なコントロールをプログラムで追加することもできますし、XAML として定義済みのコントロールをどこかでウィンドウとして再水和することもできます。

そうは言っても、理想的には、プラグインから直接コンテンツを強制的に表示するのではなく、プラグインのホストがコンテンツを追加できるコンテナを提供する (または手動で作成したダイアログ サービスを提供する) 必要があります。

于 2012-12-05T02:27:01.650 に答える