2012-12-05 15 views
-1

我想在屏幕上獲得一個XAML指定的接口,以便我可以學習WPF。但我不想從一個已經完成所有連線的視覺工作室項目開始。我不希望從「main()」函數中畫出一個xaml文件中指定的窗口的c#「hello world」。WPF XAML Hello World從頭開始,與代表

那麼如何將XAML文件連接到對象並從控制檯應用程序在屏幕上繪製它?請連線一個簡單的事件。說一個「hello world」按鈕(在xaml中指定),當按下時使控制檯打印出「hello world」。我希望以下列方式查看委託功能。

  1. XAML中內聯c#的邏輯。
  2. 與「main()」方法在同一個文件中指定的邏輯作爲一個自由函數(編輯:哦,等待c#沒有自由函數,以及沒有代碼的某種代理)。
  3. 邏輯作爲一個對象的成員函數,我相信該對象是XAML的代碼隱藏(假設這種xaml和c#對象之間的映射方式是可能的)。

此外:This answer顯示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」。我想看看將按鈕連接到我的代碼的不同方式,我不明白我可以如何更清晰。

+1

很難說出這裏要問的是什麼。你想重寫WPF代碼庫來創建和繪製一個窗口嗎?這聽起來像一個非常複雜和不必要的任務。或者你只是試圖從控制檯應用程序顯示一個'Window'?如果是這樣,那麼slugster的答案是正確的。 –

+0

我需要指定和佈局在XAML中指定的UI窗體,創建一個從XAML文件自身展開的窗口對象,然後查看UI元素如何連接到代表。這是一個XAML佈局的例子... http://code.google.com/p/wpf-mvvm-calculator/source/browse/trunk/Calculator/Views/CalculatorView.xaml?r=2 –

+0

好的...更有意義,在這種情況下,XamlReader是要走的路,我會告訴你我們用什麼從數據庫中的XAML加載UI – TimothyP

回答

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}}"/> 
+1

+1。下面是我的博客文章,展示瞭如何從資源文件中完成此操作:[Silverlight中的Dynamic ControlTemplate](http://techfilth.blogspot.co.nz/2010/01/dynamic-controltemplate-in-silverlight.html) 。 (這是Silverlight,但你仍然可以在WPF中完成)。 – slugster

+0

@slugster sweet :) – TimothyP

+0

我並沒有試圖爲WPF應用程序創建插件,我正在爲網絡服務編寫一個插件,該插件沒有GUI,也沒有合適的方法在開發過程中獲取數據到屏幕上進行調試和監視。所以,我希望能夠從無頭應用程序中隨意彈出一個窗口,並與服務進行交互。 –

1

爲了削減開門見山:

我想觸發從具有顯示信息的任何其他手段插件內特設的UI元素。

沒有絕對需要制定一個從無到有的窗口,而是可以使用ShowDialog()方法Window對象:

var myWindow = new Window(); 
myWindow.ShowDialog(); 
當然你可以通過編程添加任何控制的

你想那個窗口,或者您可以將它定義爲XAML的某個位置,然後您將其重新合併爲一個窗口。儘管如此,理想情況下,插件的主機應該爲您提供一個容器,您可以添加內容(或提供您手動滾動的對話服務),而不必直接從該插件。

+0

,不回答我的問題....和信息是實時流數據....這個問題有它自己的優點,問題的結尾只是瑣事,並沒有關係與題。爲什麼人們試圖獲得簡單的答案? –

+0

@slugster我贊成這個,因爲它不值得downvote。很難說他想要什麼 –

+1

@HassanSyed然後你的問題要麼被誤導或誤導。您是否顯示必須按原樣呈現在屏幕上的圖形數據?如果沒有,那麼我的答案涵蓋了你的要求(我也在發佈後不久編輯它,確保你已經看到了它)。 – slugster