我目前正在创建一些测试控件。在WPF中一切都很好,我可以子类化,例如边框或ScrollViewer。在Silverlight中这是不可能的,所以我必须做一个小技巧(多目标)......
我从StackPanel派生我的test元素并将内容添加为child。当然,我也可以从WrapPanel,Canvas派生......
我的问题是,在使用这种方法时,Silverlight(未密封)中的哪个UI元素最好使用。它应尽可能少地干扰测试元件。或者我必须在元素之间进行区分(例如宽度设置。)..
让我举一个更好的例子。如果我想要一个简单的TextBlock,它总是说“Hello”并且有一个红色背景。在WPF中,我将TextBlock子类化。这在Silverlight中是不可能的。我会在那里这样做:
public class RedTextBlock : StackPanel
{
public TextBlock WrappedBlock {get; private set;}
public RedTextBlock()
{
WrappedBlock = new TextBlock
{
Text = "Hello",
Background = new SolidColorBrush(Colors.Red)
};
Children.Add(WrappedBlock);
}
}
我真的不喜欢这个解决方案,但没有找到更好的解决方案。但在这种情况下,我不确定StackPanel是否不适合我的例子。因为我认为它可能会影响布局(例如占用尽可能多的空间)而不是直接的文本块实例。
在其他情况下,包含控件可能是ScrollViewer,一个Image,无论如何..所有我无法“正确”子类化的控件,因为它们是密封的。
这种方法是否正常,哪种控制在这种通用情况下是最好的子类,还是有更好的想法? (我不想去“接口 - 视图属性”的方式,我真的想要子类化现有的UI元素)..
克里斯
答案 0 :(得分:0)
如果你想堆叠东西,那么StackPanel就可以了。如果您只有一个孩子,那么您最好的选择是use ContentControl并将TextBlock设置为内容。如果您有很多孩子,您可以使用Panel,但如果您走这条路线,您必须手动布置所有孩子。但是对于你所描述的内容,我认为内容控制是最好的。
答案 1 :(得分:0)
让我举一个更好的例子。如果我想要一个简单的TextBlock,它总是说“Hello”并且有一个红色背景。在WPF中,我将TextBlock子类化。
您考虑使用样式而不是子类吗?它更适合这种情况。
答案 2 :(得分:0)
答案是直接停止使用WPF和Silverlight,因为它们在API级别上不兼容,并且在将代码从一个移植到另一个代码时总是会遇到问题。但是,如果您希望保留对WPF和Silverlight的投资并维护单个代码库,则可以使用NOV。您的案例自定义文本控件将如下所示:
public class MyTextBox : NTextBox
{
public MyTextBox()
{
base.Text = "Hello";
}
}
并且没有其他问题 - 文本框可以在WPF,Silverlight,WindowsForms和MonoMac / XamarinMac中使用。