重用用户控件

时间:2014-01-09 11:01:36

标签: wpf user-controls

我正在尝试更改现有的WPF应用程序,而我缺乏WPF体验(我是WINFORMS)使这很困难。

我遇到过需要重用UserControl的情况,我不知道如何在修改xaml方面做到这一点。我会解释一下。

UserControlA具有以下代码:

   <Grid Name="gdMain" Style="{StaticResource ContentRoot}">
        <content:MonitorAlarmsPage />
    </Grid>

现在,“MonitorAlarmsPage”是一个AXML文档,它定义了另一个UserControl - UserControlB。创建此UserControl后,必须在应用程序的生命周期内保持不变。

所以,我可以有很多UserControlAs,但只有一个UserControlB。

我创建了一个静态类,它有一个适当的UserControlB字段,在创建UserControlB时会更新,但是如何修改content:MonitorAlarmsPage以便网格的内容被现有的UserControlB替换为引用在这个静态类中,而不是由定义UserControlB的XAML文件?这可以实际完成吗?即,实际上,在XAML页面中插入预先创建的用户控件。

为了使事情更清楚一点,UserControlB本质上是一个可以放在另一个页面内的页面。页面很复杂,创建时会产生巨大的开销,因此只能创建一次。

1 个答案:

答案 0 :(得分:1)

WPF与WinForms非常不同,所以你肯定会为你完成工作。解决问题的基本思路是这样的。您需要向MonitorAlarmsPage控件添加DependencyProperty。这将使您能够从控件外部绑定到此属性的数据。此属性应该是您定义的一种自定义类,其中包含所有所需的属性控制

下一步是开发一个DataTemplate,它定义了WPF在遇到它的实例时应该如何显示你的自定义类。在这个DataTemplate中,你声明你的内部控件,这样当WPF看到自定义类时,它会显示内部控件并将自定义类设置为内部控件的DataContext

<DataTemplate DataType="{x:Type YourXmlNamespacePrefix:YourCustomClass}">
    <YourControlsXmlNamespacePrefix:YourInnerControl DataContext="{Binding}" />
</DataTemplate>

最后,您需要将自定义类(static类)的数据绑定到外部UserControl

<content:MonitorAlarmsPage YourCustomClassProperty="{Binding YourStaticClass}" />

所以要明确......这个static类应该是一个数据类,不是一个UI类。使用WPF时,我们操纵数据,而不是UI元素。我们让精彩的模板系统为我们生成UI。