2014-03-31 3 views
0

UserControl은 프로그래밍 방식으로 스택 패널에 표시하고 싶습니다. .Silverlight UserControl이 표시되지 않습니다.

내가 할 때, UC는 화면에 표시되지 않습니다. 도구 상자에서 하나의 인스턴스를 드래그하면 제대로 작동합니다.

사용자 정의 컨트롤은 XAML은 코드 숨김

<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> 

입니다

public partial class SpecialNumberOption : UserControl 
{ 


    public event RoutedEventHandler Click; 



    public SpecialNumberOption() 
    { 
     InitializeComponent(); 


     this.applyStyle(); 
    } 

    public SpecialNumberOption(SurveyQuestionOption option) 
    { 
     this.buttonMe.Content = option.Text; 
     this.subText.Text = option.SubText; 

     this.applyStyle(); 
    } 


    private void applyStyle() 
    { 

     this.buttonMe.FontSize = 26; 
     this.buttonMe.Background = standardBackground; 
     this.buttonMe.Foreground = standardForecolor; 

    } 

    ///Raise the event to the outside 

    private void buttonMe_Click(object sender, RoutedEventArgs e) 
    { 
     Click(this, e); 
    } 



} 

구현

이 임 제어

,369을 추가하는 방법입니다
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; 
     .... 

    } 

내가 대체 생성자를 사용할 때 작동을 중단 할 때 이것이 발견

업데이트. 기본 생성자를 사용해야합니다. 이게 정상인가? 여기 정확성에 대한 게시 된 모든 코드를 확인하지만하지 않은

+0

r.IsEnabled = false; 사실대로 해보십시오. – ray

+0

그래, 그걸 시도해도 안된다. IsEnabled는 컨트롤이 상호 작용하도록 허용하거나 금지해야한다. 시각적으로 나타나야합니다. – IEnumerable

+0

대신 foreach 루프에서 하나의 컨트롤을 동적으로 추가해보십시오. – ray

답변

0

는 생성자의 문제입니다 : 여기

가있는 버전입니다 당신은 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에서 그것을 사용하고 매개 변수화 할 수있게합니다.

+0

감사합니다. 위와 같은 기본 생성자를 호출 할 수 있다는 것을 알지 못했습니다. Im은 Silverlight를 처음 사용하므로 대체 생성자를 만드는 데 익숙합니다. – IEnumerable

+0

제 잘못 이해하지 마세요. 자신의 유형에 대해 여러 생성자를 사용하는 것이 좋습니다. 그러나'control'에서 파생되면 특별한 유형의 유형을 만듭니다. 즉,'xaml' 마크 업에서 선언적으로 사용될 유형입니다 여기서 생성자 매개 변수는 사용할 수 없습니다. 그래서 "올바른 일을"하기위한 내 개인적인 경험적 방법 중 하나는 다음과 같습니다. DependencyObject에서 파생 된 유형은 생성자 매개 변수를 사용하지 않아야합니다. 그러나 언제나처럼, 그것은 내 개인적인 경험적 방법 일 뿐이며 잘못 될 수 있습니다. 저를 안전하다고 느끼게 만드는 방식으로 코드를 작성하는 것은 나의 트릭입니다. – Martin

+0

예. 좋은 접근입니다. 감사 – IEnumerable

관련 문제