我是Silverlight的新手,必须编写几个SL应用程序,这些应用程序将分享很多东西。
我计划将所有常见的C#代码放在一个单独的程序集中,但我对XAML部分非常恼火。
我的所有应用程序都有一些共同的控件:
我在网上搜索提示并发现XAML代码无法继承。
所以我考虑创建一个包含我的常用控件的大型自定义控件,然后将其添加到我所有应用程序的主页面上,但这似乎不是正确的方法。
这里最好的做法是什么?
任何帮助表示赞赏,
编辑:我想在这里得到的是我已经使用WinForms做的事情。我创建了一个“基础”WinForm并对其进行了一些控制。然后,当我创建继承了这个“基础”WinForm的新WinForms时,他们拥有所有基本控件。我没有必要使用任何自定义控件。
但我明白Silverlight不是WinForm,我想要的可能不是这样(或根本不可能?)。
答案 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。仅仅是我的个人经历,可能不是通用指南。