最好不要在Silverlight中派生的密封UI元素

时间:2009-11-04 14:18:58

标签: wpf silverlight

我目前正在创建一些测试控件。在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元素)..

克里斯

3 个答案:

答案 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中使用。