2016-05-04 35 views
5

創建一個C#類的實例,我已經用C#編寫工作的應用程序,我現在要擴展該應用程序允許用戶查看應用程序,並查看在網絡內置之間切換瀏覽器(在相同的應用程序窗口內)。從內XAML

我也有一個單獨的工作網頁瀏覽器,這也被寫在C#。

我剛添加的功能,原來的應用程序,包括「標籤」顯示,在原來的應用程序將在第一個選項卡上顯示,以及一個內置的網絡瀏覽器的第二個選項卡上。

該應用程序的「標籤」顯示器已經使用在Visual Studio XAML標記創建。我現在想要將用C#編寫的Web瀏覽器實例添加到我在XAML標記中創建的第二個選項卡中。

這將是這樣的:

<TabControl> 
     <TabItem Header="Browser"> 
      <StackPanel> 
       <!-- Call/ instantiate the browser here --> 
      </StackPanel> 
     </TabItem> 
</TabControl> 

但我不知道我怎麼稱呼/創建XAML標記中的瀏覽器的一個實例...

瀏覽器一直使用創建C#:

namespace Agent 
{ 
    public partial class Browser : Form 
    { 
     public Browser() 
     { 
      ... 
     } 
    } 
} 

任何人都可以向我解釋如何創建XAML標記的'內的Browser一個實例?

編輯

好了,我已經編輯我的XAML標記在這得到了答案建議suggested-我現在有:

<Window ... 
    xmlns:Agent="clr-namespace:Agent" 
    ...> 
    <Grid> 
     ... 
     <TabControl> 
      <TabItem Header="R"> 
       <StackPanel> 
        ... 
       </StackPanel> 
      </TabItem> 
      <TabItem Header="Browser"> 
       <Agent:Browser x:Name="Browser" /> 
      </TabItem> 
     </TabControl> 
    </Grid> 
</Window> 

我也更新了我的Browser.cs類,使現在是擴大UserControl,而不是Form

public partial class Browser : UserControl{ 

不過,我上線得到一個編譯錯誤:

<Agent:Browser x:Name="Browser" /> 

它說:

命名爲「瀏覽器」不會在命名空間中「CLR的命名空間:代理」。

但顯然Browser並在Agent存在,正如我在這裏包含的代碼所示。事實上,鍵入線<Agent:Browser x:Name="Browser />的時候,當我鍵入:Browser是那來的選項之一起來自動完成菜單...

我在做什麼錯在這裏?爲什麼編譯器不認爲Agent裏面存在Browser

+1

您正在將具有美麗'WPF'的'WinForms'混合在一起(老式和醜陋,我個人認爲)。對於'WinForms',你需要''元素。祝你好運,你將需要它。 – XAMlMAX

+0

我剛接觸'WPF',並且沒有在使用'WinForms'之前...有什麼區別?我該怎麼做? – someone2088

+0

您是否可以使用來自UC的新瀏覽器更新您的問題,並向我們展示您在XAML中的使用情況? – XAMlMAX

回答

5

的關鍵,在實例化XAML任何目的是確保命名空間聲明。您可以提供任何XML前綴並將其分配給您的CLR名稱空間(ref),它將像using語句一樣行事。例如:

<TabControl xmlns:agent="clr-namespace:Agent"> 
    <TabItem Header="Browser"> 
     <StackPanel> 
      <agent:Browser/> 
     </StackPanel> 
    </TabItem> 
</TabControl> 

注意:你的對象必須擴展UIElement(或它的一個子)才能在XAML樹。如果您的控件是WinForms控件,則需要找到等效的XAML控件或將其包裝在WindowsFormsHostref)中。


WPF與WinForms的

本節的目的是幫助識別哪個平臺的代碼是命名空間,以及一些權衡。我已經使用過,並且可以從經驗中得知,他們每個人都有好的積分,並且不是那麼好。

  • WinForms類位於System.Windows.Forms命名空間中,並可通過引用System.Windows.Forms.dll程序集來獲得。
  • WPF類生活在System.WindowsSystem.Windows.Controls命名空間,並且可通過引用一組DLL
  • 的WinForms渲染立即的。這意味着你正在處理位圖,你自己負責清理和重新繪製東西(通常你可以調用Invalidate())。如果您執行的圖像位操作繁重,則WinForms更易於使用。
  • WPF呈現是聲明式。這意味着更多的工作被卸載到您的GPU,並且您只是告訴它如何繪製東西。您還可以使用GPU渲染着色器來獲得特殊效果。 WPF有一個更好的外觀,但它有一個讓事情變得簡單但不可能的事情的聲譽。
  • WinForms比較容易學習,但是開箱即可看到過時的外觀。
  • WPF是圍繞數據綁定構建的,使UI能夠自動更新以響應屬性值。它也可以完全重新調整,儘管這是一項非常重要的任務。

如果你剛剛開始,我會繼續努力,並咬緊牙關開始WPF的較重學習曲線。這將提供轉移到像Windows Store應用程序等平臺,一個基本的瞭解等

+0

嘿,謝謝你的回答。我已經給出了你提出的建議,但是我在XAML中得到了一個編譯錯誤,它說:'沒有定義名稱空間前綴'Agent'。「......編譯錯誤突出顯示了''。 – someone2088

+0

我的'瀏覽器'類擴展了'Form',我猜你是在說什麼需要找到等價的XAML控件? – someone2088

+0

命名空間區分大小寫,因此請確保大小寫正確。是的,從WinForms API擴展'Form'不會起作用。 WPF的等價物將是'UserControl'基類。你真的需要決定你正在構建哪個平臺,只使用該平臺。 –

0

首先,你需要該標籤將您UserControl開始標籤內,像這樣:

<UserControl x:Class="View.testControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:Agent="clr-namespace:Agent"> 

然後你可以使用它像這樣:

<TabControl> 
    <TabItem Header="R"> 
     <StackPanel> 
      ... 
     </StackPanel> 
    </TabItem> 
    <TabItem Header="Browser"> 
     <Agent:Browser x:Name="Browser" /> 
    </TabItem> 
</TabControl> 

編輯
從你告訴我的意見,你需要創建一個Custom Control在你的WPF項目中。爲此,您需要:

  1. 右鍵單擊您的項目;
  2. 選擇添加新項目;
  3. 從已安裝(位於左欄)選擇WPF;
  4. 從中間列表中選擇Custom Control;

現在,您可以使用xmlns屬性在您的XAML中創建該控件。
Here is a great example from msdn關於如何創建自定義控件

+0

我目前沒有''標籤...我猜我需要在某個地方包含該標籤?我會在哪裏築巢?我的XML結構目前是:'

....'和我試圖巢第二個''標籤內的瀏覽器。 – someone2088

+0

'xmlns:Agent =「clr-namespace:Agent」'在我的' ...'標籤中 - 我想這會是'UserControl'開啓標籤的意思嗎? – someone2088

+0

@ someone2088是的,你需要將 XAMlMAX