从XAML内部创建C#类的实例

时间:2016-05-04 15:22:49

标签: c# wpf xaml

我有一个用C#编写的工作应用程序,现在我想扩展该应用程序,以允许用户在查看应用程序和查看内置Web浏览器(在同一应用程序窗口内)之间切换。 / p>

我还有一个单独的工作网络浏览器,也是用C#编写的。

我刚刚在原始应用程序中添加了功能,包括“选项卡式”显示,原始应用程序将显示在第一个选项卡上,内置Web浏览器显示在第二个选项卡上。

应用程序的“标签”显示是使用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标记 - 我现在有:

<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-namespace:Agent”中不存在名称“Browser”。

Browser确实存在Agent,如我在此处所包含的代码所示......实际上,在键入行<Agent:Browser x:Name="Browser />时,我输入{ {1}},:是自动填充菜单中出现的选项之一...

我在这里做错了什么?为什么编译器不认为Browser中存在Browser

2 个答案:

答案 0 :(得分: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应用商店应用程序等。

答案 1 :(得分: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>  

修改
根据您在评论中告诉我的内容,您需要在WPF项目中创建Custom Control。要做到这一点,你需要:

  1. 右键单击您的项目;
  2. 选择添加新项;
  3. 从已安装(位于左侧列)中选择WPF;
  4. 从中间列的列表中选择Custom Control;
  5. 现在,您可以使用xmlns属性在XAML中创建该控件 关于如何创建自定义控件的Here is a great example from msdn