对于具有通用控件的多个Silverlight应用程序,什么是一个好方法?

时间:2011-10-31 15:05:11

标签: silverlight xaml inheritance base-class

我是Silverlight的新手,必须编写几个SL应用程序,这些应用程序将分享很多东西。

我计划将所有常见的C#代码放在一个单独的程序集中,但我对XAML部分非常恼火。

我的所有应用程序都有一些共同的控件:

  • 顶部的菜单栏
  • 顶部的工具栏
  • 底部的状态栏,
  • 左侧的面板。

我在网上搜索提示并发现XAML代码无法继承。

所以我考虑创建一个包含我的常用控件的大型自定义控件,然后将其添加到我所有应用程序的主页面上,但这似乎不是正确的方法。

这里最好的做法是什么?

任何帮助表示赞赏,

编辑:我想在这里得到的是我已经使用WinForms做的事情。我创建了一个“基础”WinForm并对其进行了一些控制。然后,当我创建继承了这个“基础”WinForm的新WinForms时,他们拥有所有基本控件。我没有必要使用任何自定义控件。

但我明白Silverlight不是WinForm,我想要的可能不是这样(或根本不可能?)。

2 个答案:

答案 0 :(得分:2)

这取决于您要采用的路由,是否要创建一个带有某些模板的资源文件等,这些模板会单独复制/链接到每个应用程序中,或者使用常见DLL中包含的内容。

如果你想做后者,这是一种方法。子类ContentControl在其控件模板中定义您的公共布局(您可以在XAML中完成所有操作),包括在适当的位置绑定到其内容:

<ContentControl x:Class="MyLibrary.MyLayoutControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ContentControl.Template>
        <ControlTemplate TargetType="ContentControl">
            <!-- this could be a layout grid with various other controls in it -->
            <Border BorderBrush="Red" BorderThickness="2" CornerRadius="5">
                <ContentPresenter Content="{TemplateBinding Content}" />
            </Border>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>

然后在您的应用程序根控件中使用它:

<UserControl x:Class="InCustomControlTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:MyLibrary;assembly=MyLibrary">

    <c:MyLayoutControl>
        <Button Content="Hi I am a button" />
    </c:MyLayoutControl>
</UserControl>

如果你想做更复杂的事情,你应该做一个自定义控制;虽然在大多数情况下,您可以使用一些UserControl来获取各种组件(例如您的状态栏),这些组件会放到正确的位置。

答案 1 :(得分:0)

将xaml资源放入库项目中没有大问题。 从其他项目引用资源时,请确保包含程序集名称。 还有模板上的继承,您可以在其中放置BasedOn属性。

编辑:好吧,看看我们之前工作的项目,我现在记得我们实际上遇到了问题,并将xaml资源复制到每个项目......我忘了=) 我认为它有效,但在这里和那里带来了一些问题。也许将xaml文件添加为链接?

我个人也不会创建很多控件,而是拥有大多数东西的模板。如果你有控件,最好只使用模板在c#中编写它们,防止带有代码隐藏的xaml。仅仅是我的个人经历,可能不是通用指南。