2017-05-21 10 views
-1

나는 Thumb은 그래서 (간결하게 잘립니다) 상속 클래스가 있습니다업데이트 된 ControlTemplate의 컨트롤 텍스트

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

<ControlTemplate x:Key="MyControlTemplate"> 
    <Border BorderBrush="Black" BorderThickness="1" Name="border"> 
     <StackPanel> 
      <StackPanel.Background> 
       <SolidColorBrush Color="White" Opacity="1"/> 
      </StackPanel.Background> 
      <TextBlock Name="controlType" Padding="5,0,5,3" HorizontalAlignment="Stretch" TextAlignment="Center"> 
       <TextBlock.Background> 
        <SolidColorBrush Color="#FFC0C0C0" Opacity="1"/> 
       </TextBlock.Background> 
      </TextBlock> 
     </StackPanel> 
    </Border> 
</ControlTemplate> 
:

public class MyControl : Thumb 
{ 
    public MyControl() 
     : base() 
    { 
     this.MinWidth = 80; 
     this.MinHeight = 60; 

     /* ... */ 
    } 
} 

나는 아래처럼 보이는 ControlTemplate이 있습니다를

MyControl의 인스턴스를 다른 클래스로 인스턴스화하고 Text 속성을로 설정하려고합니다.템플릿의 TextBlock 컨트롤.

public System.Windows.UIElement Create() 
{ 
    MyControl control = new MyControl(); 
    var template = Application.Current.Resources["MyControlTemplate"] as ControlTemplate; 

    var contents = template.LoadContent(); 
    var panel = (StackPanel)VisualTreeHelper.GetChild(contents, 0); 
    foreach (var textBlock in panel.Children.OfType<TextBlock>()) 
    { 
     switch (textBlock.Name) 
     { 
      case "controlType": 
       textBlock.Text = "MyText"; 
       textBlock.InvalidateVisual(); 
       break; 
     } 
    } 

    control.Template = template; 
    control.UpdateLayout(); 

    return control; 
} 

그러나 텍스트 "MyText"는 TextBlock에 표시되지 않습니다. 내가 뭘 놓치고 있니?

+0

, 다운 투표 누구든지 당신이 왜 그랬는지 의문의 소유자에게 알려 : 당신은 MyControl의 인스턴스에 적용된 TextBlockText 속성을 설정합니다. 비참한 삶을 살기 때문에 단순히 투표를 할 수는 없습니다. – Josh

답변

1

LoadContent() 메서드는 템플릿의 내용을 별도의 인스턴스로로드합니다. 이것은 당신이 원하는 것이 아닙니다. 그래서

public System.Windows.UIElement Create() 
{ 
    MyControl control = new MyControl(); 
    var template = Application.Current.Resources["MyControlTemplate"] as ControlTemplate; 
    control.Template = template; 
    control.ApplyTemplate(); 

    var border = (Border)VisualTreeHelper.GetChild(control, 0); 
    var panel = (StackPanel)VisualTreeHelper.GetChild(border, 0); 
    foreach (var textBlock in panel.Children.OfType<TextBlock>()) 
    { 
     switch (textBlock.Name) 
     { 
      case "controlType": 
       textBlock.Text = "MyText"; 
       textBlock.InvalidateVisual(); 
       break; 
     } 
    } 
    return control; 
} 
+0

고마워요, @ mm8. 나는 지금 당장 마을에 없다. 내가 돌아 왔을 때해볼거야. – Josh

+0

그 덕분에, 고마워! – Josh