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

Nob*_*fer 5 c# wpf xaml

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

我还有一个单独的工作Web浏览器,它也是用C#编写的.

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

应用程序的"选项卡式"显示是使用XAMLVisual Studio中的标记创建的.我现在想要将已用C#编写的Web浏览器实例添加到我在XAML标记中创建的第二个选项卡中.

它会是这样的:

<TabControl>
        <TabItem Header="Browser">
            <StackPanel>
                <!-- Call/ instantiate the browser here -->
            </StackPanel>
        </TabItem>
</TabControl>
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在XAML标记内调用/创建浏览器实例...

浏览器已使用C#创建:

namespace Agent
{
    public partial class Browser : Form
    {
        public Browser()
        {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释如何Browser在XAML标记的内部创建一个实例?

编辑

好的,所以我按照建议的答案中的建议编辑了我的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>
Run Code Online (Sandbox Code Playgroud)

我还更新了我的Browser.cs课程,现在它正在扩展UserControl,而不是Form:

public partial class Browser : UserControl{
Run Code Online (Sandbox Code Playgroud)

但是,我收到了一行编译错误:

<Agent:Browser x:Name="Browser" />
Run Code Online (Sandbox Code Playgroud)

其中说:

名称"Browser"在命名空间"clr-namespace:Agent"中不存在.

但显然Browser确实存在Agent,如我在此处所包含的代码所示......实际上<Agent:Browser x:Name="Browser />,当我输入行时,当我输入时:,Browser是自动完成菜单中出现的选项之一...

我在这做错了什么?为什么编译器不认为Browser存在于内部Agent

Ber*_*sch 5

在XAML中实例化任何对象的关键是确保声明命名空间.您可以提供任何XML前缀并将其分配给您的CLR命名空间(ref),它将像一个using语句.例如:

<TabControl xmlns:agent="clr-namespace:Agent">
    <TabItem Header="Browser">
        <StackPanel>
            <agent:Browser/>
        </StackPanel>
    </TabItem>
</TabControl>
Run Code Online (Sandbox Code Playgroud)

注意:您的对象必须扩展UIElement(或其子项之一)才能在XAML树中工作.如果您的控件是WinForms控件,您需要找到等效的XAML控件或将其包装在WindowsFormsHost(ref)中.


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应用商店应用程序等.