C# Silverlight用户控件未显示

C# Silverlight用户控件未显示,c#,.net,silverlight,user-controls,C#,.net,Silverlight,User Controls,我有一个简单的UserControl,我想以编程方式显示在stackpanel中 当我这样做时,UC不会显示在屏幕上。如果我从工具箱中拖动一个实例,它可以正常工作 用户控件为XAML is <UserControl x:Class="MYProj.Controls.SpecialNumberOption" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://sc

我有一个简单的
UserControl
,我想以编程方式显示在stackpanel中

当我这样做时,UC不会显示在屏幕上。如果我从工具箱中拖动一个实例,它可以正常工作

用户控件为XAML is

<UserControl x:Class="MYProj.Controls.SpecialNumberOption"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="200">
    <Viewbox>
    <Grid x:Name="LayoutRoot" Background="White" Width="200" Height="300">
        <Button x:Name="buttonMe" Content="Button" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="180" Height="150" Style="{StaticResource NumberButtonStyle}" Click="buttonMe_Click"/>
        <TextBlock x:Name="subText" HorizontalAlignment="Left" Margin="10,165,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Height="125" Width="180" FontStyle="Italic" TextAlignment="Center"/>

    </Grid>
    </Viewbox>
</UserControl>
实施

这就是我添加控件的方式

    foreach (var y in x.Options)
    {

            //Create new instance from An object
            var r = new SpecialNumberOption(y);

            // Set visibility
            r.Visibility = System.Windows.Visibility.Visible;


            r.IsEnabled = false;

            //Assign the event handler
            r.Click += r_Click;

            //This is my stackpanel
            listOptions.Children.Add(r);


            ....
    }




    //Handle the click event
    void r_Click(object sender, RoutedEventArgs e)
    {

        SpecialNumberOption o = (SpecialNumberOption)e.OriginalSource;
        ....

    }
更新

我发现当我使用替代构造函数时,它停止工作。
我必须使用默认构造函数。这正常吗

我没有检查您发布的所有代码的正确性,但您的构造函数有一个问题:您必须调用
InitializeComponent
(并且必须在访问任何命名元素之前进行)

以下是一个带有修复程序的版本:

public SpecialNumberOption()
{
    InitializeComponent();
    this.applyStyle();
}

public SpecialNumberOption(SurveyQuestionOption option) : this () //will call the empty default constructor
{
    this.buttonMe.Content = option.Text;
    this.subText.Text = option.SubText;
}

注释:我认为控件的空格多于空的默认构造函数。


应通过属性设置器设置参数。它使您和任何将重用您的控件的人能够在xaml中使用和参数化它。

r.IsEnabled=false;试一下,就像我也试过的一样,不可以,IsEnabled应该只允许/阻止控件与之交互。在foreach循环中,你不能尝试动态添加一个控件吗?我这样做也是为了测试,但似乎唯一的问题是,当我尝试以编程方式添加此控件时,如果我在设计时使用XAML进行添加,则没有问题。ohh InitializeComponent();在该构造函数中缺少。在初始化您试图为ControlsHanks设置文本的组件之前,我不知道我可以像上面那样调用默认构造函数。我是Silverlight的新手,所以我习惯于创建备用构造函数。别误会我的意思,为您自己的类型使用多个构造函数是完全可以的,但是当您从
control
派生时,您会创建一种特殊类型:一种将在
xaml
标记中声明使用的类型,其中不能使用构造函数参数。所以我个人关于“做正确的事情”的一个启发是:从DependencyObject派生的类型不能使用构造函数参数。但和往常一样,这只是我个人的启发,也可能是错误的——这只是我的伎俩,让我以一种让我感到安全的方式编写代码。
public SpecialNumberOption()
{
    InitializeComponent();
    this.applyStyle();
}

public SpecialNumberOption(SurveyQuestionOption option) : this () //will call the empty default constructor
{
    this.buttonMe.Content = option.Text;
    this.subText.Text = option.SubText;
}