2013-05-02 41 views
0

我有TabControl,我有一个计划来生成动态TabItems并填写ControlTemplate。WPF在ControlTemplate的TextBlock上更改文本属性

控件模板:

<Window.Resources> 
    <ControlTemplate x:Key="Qtemp" TargetType="Control"> 
     <ControlTemplate.Resources> 
      <ControlTemplate x:Key="yesButton" TargetType="{x:Type Button}"> 
       <Grid> 
        <Image Visibility="Visible" Name="Normal" Source="/TabItemTemplate;component/Images/yes.png" /> 
        <Image Visibility="Hidden" Name="Pressed" Source="/TabItemTemplate;component/Images/yes_p.png" /> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="Button.IsPressed" Value="True"> 
         <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/> 
         <Setter TargetName="Pressed" Property="Visibility" Value="Visible"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
      <ControlTemplate x:Key="noButton" TargetType="{x:Type Button}"> 
       <Grid> 
        <Image Visibility="Visible" Name="Normal" Source="/TabItemTemplate;component/Images/no.png" /> 
        <Image Visibility="Hidden" Name="Pressed" Source="/TabItemTemplate;component/Images/no_p.png" /> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/> 
         <Setter TargetName="Pressed" Property="Visibility" Value="Visible"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
      <ControlTemplate x:Key="circleButton"> 
       <Grid> 
        <Ellipse> 
         <Ellipse.Fill> 
          <ImageBrush ImageSource="{Binding Path=Tag, RelativeSource={RelativeSource TemplatedParent}}" /> 
         </Ellipse.Fill> 
        </Ellipse> 
       </Grid> 
      </ControlTemplate> 
     </ControlTemplate.Resources> 
      <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="80"/> 
         <RowDefinition/> 
         <RowDefinition Height="Auto"/> 
        </Grid.RowDefinitions> 
      <Ellipse Grid.Row="1" Margin="-1024,-75,0,0" Name="progress_bar" Fill="#FF01325E" Width="424" Height="424" StrokeThickness="0" RenderTransformOrigin=".5,.5"> 
       <Ellipse.Clip> 
        <RectangleGeometry Rect="0,0,212,424"/> 
       </Ellipse.Clip> 
       <Ellipse.RenderTransform> 
        <RotateTransform Angle="45"/> 
       </Ellipse.RenderTransform> 
      </Ellipse> 
      <Grid Grid.RowSpan="3" Grid.Row="0" Width="Auto" Height="Auto" > 
       <Grid.Background> 
        <ImageBrush ImageSource="/TabItemTemplate;component/Images/Q_bg.png" /> 
       </Grid.Background> 
      </Grid> 
      <TextBlock Grid.Row="1" Name="QBody" Width="400" Margin="-120,-100,0,0" Foreground="#FF333333" TextWrapping="Wrap" FontFamily="Arial" FontSize="28" TextAlignment="Left" FontWeight="Bold" VerticalAlignment="Center" Text="{Binding}" /> 
      <StackPanel Grid.Row="1" Width="350" HorizontalAlignment="Right"> 
       <Button Width="172" Height="172" Name="BT_yes" Template="{StaticResource yesButton}" Click="BT_NextQ" /> 
       <Button Width="172" Height="172" Name="BT_no" Margin="0,20,0,0" Template="{StaticResource noButton}" Click="BT_NextQ" /> 
      </StackPanel> 
      <Image Grid.Row="2" Source="/TabItemTemplate;component/Images/toolbar.png" /> 
      <Button Grid.Row="2" Width="56" Height="56" Tag="/TabItemTemplate;component/Images/home.png" HorizontalAlignment="Left" Margin="90,0,0,15" Template="{StaticResource circleButton}" /> 
      <Button Grid.Row="2" Width="56" Height="56" Tag="/TabItemTemplate;component/Images/back.png" HorizontalAlignment="Left" Margin="26,0,0,15" Template="{StaticResource circleButton}" /> 
     </Grid> 
    </ControlTemplate> 
</Window.Resources> 

在XAML:

<TabControl HorizontalAlignment="Stretch" Name="navTab" VerticalAlignment="Stretch" BorderThickness="0" Padding="0"> 
     <TabItem Name="tabItem1a" Header="static"> 
      <Control Template="{StaticResource Qtemp}" /> 
     </TabItem> 
    </TabControl> 

CS文件:

private void Window_Loaded(object sender, RoutedEventArgs e) 


{ 
for (int i = 1; i < 6; i++) 
{ 
     TabItem newTab = new TabItem(); 
     Control newControl = new Control(); 
     newControl.Template = (ControlTemplate)FindResource("Qtemp"); 

     //TextBlock tb = (TextBlock)newControl.Template.FindName("Qbody", newControl); 
     //tb.Text = "TEST" + i.ToString(); 
     newTab.Header = "Dynamic"+i.ToString(); 
     newTab.Name = "Question" + i.ToString(); 
     newTab.Content = newControl; 
     navTab.Items.Add(newTab); 

} 
} 

在模板我的TextBlock “Qbody” 和椭圆 “progress_bar”。 我试图添加文本到“Qbody”和RorateTransform角度为“progress_bar”,但我不能访问模板中的任何控件。

我想:

TextBlock tb = (TextBlock)newControl.Template.FindName("Qbody", newControl);

但它返回null

任何人都可以帮助我。 我不知道我做错了什么。 有其他方法来设置这两个控件。

回答

1

你有这个标记为mvvm,但你在做什么违反mvvm原则。你的进度条和文本框应该绑定到你的视图模型,然后你可以访问他们的属性。

您的控件为空,因为它们尚未创建。

但是如果你想在你背后需要访问控制框架中的元素的应用模板事件(Tab控件)使用代码

Framework ApplyTemplate Event

干杯

编辑1:

您必须实现iNotifyPropertyChanged才能让UI了解视图模型中属性的更改。你会为你的财产柜台的每一次迭代引发这个事件。

此外,您需要的范围不能在一个答案中涵盖。我建议阅读更多关于MVVM和WPF的知识,也许可以使用现有的框架来帮助像MVVM-Light或Caliburn.Micro。

+0

感谢您的一些想法,我甚至不知道如何开始。我将用一些属性创建ViewModel。我还有一个问题:如果我创建ViewModel和属性,即TextBloc_body和EllipseAngle,并将它们绑定到模板,如果我为每个循环识别更改它会发生什么。模板绑定他们的时刻,当我分配值的财产,并保持相同的价值或所有将获得最后的财产变化的价值? – addicted 2013-05-02 15:45:08

+0

ViewModel中的属性不工作。我的意思是它的工作,但所有的TextBlock有文字的最后literation更改属性。我如何才能对每个tabitem上的TextBlock有不同的文字? – addicted 2013-05-02 16:35:02

+0

@addicted请参阅编辑以获取关于为什么textblock不是chnaging的信息 – 2013-05-02 21:40:24

相关问题