C# WPF更改ControlTemplate中TextBlock的文本属性
我有TabControl,我有一个计划来生成Dynamicly TabItems并用ControlTemplate填充 控制模板:C# WPF更改ControlTemplate中TextBlock的文本属性,c#,wpf,mvvm,.net-3.5,C#,Wpf,Mvvm,.net 3.5,我有TabControl,我有一个计划来生成Dynamicly TabItems并用ControlTemplate填充 控制模板: <Window.Resources> <ControlTemplate x:Key="Qtemp" TargetType="Control"> <ControlTemplate.Resources> <ControlTemplate x:Key="yesButton" Tar
<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);
}
}
private void Window\u已加载(对象发送方,路由目标)
{
对于(int i=1;i<6;i++)
{
TabItem newTab=新TabItem();
Control newControl=新控件();
模板=(ControlTemplate)FindResource(“Qtemp”);
//TextBlock tb=(TextBlock)newControl.Template.FindName(“Qbody”,newControl);
//tb.Text=“TEST”+i.ToString();
newTab.Header=“Dynamic”+i.ToString();
newTab.Name=“问题”+i.ToString();
newTab.Content=newControl;
navTab.Items.Add(新选项卡);
}
}
在模板中,我有文本块“Qbody”和椭圆“progress\u bar”。
我试图添加文本到“Qbody”和“progress_bar”的RorateTransform角度,但我无法访问模板中的任何控件
我试过:
TextBlock=(TextBlock)newControl.Template.FindName(“Qbody”,newControl)代码>
但它返回null
有人能帮我吗。
我不知道我做错了什么。
是设置这两个控件的任何其他方法。您已将其标记为mvvm,但您所做的操作违反了mvvm原则。进度条和文本框应该绑定到viewmodel,然后您可以在那里访问它们的属性
您的控件为空,因为它们尚未创建
但是,如果要使用代码隐藏,则需要访问框架元素(选项卡控件)的apply template事件中的控件
干杯
编辑1:
必须实现iNotifyPropertyChanged,才能使UI“了解”viewmodel中属性的更改。您将为属性计数器的每次迭代引发此事件
同样,你所需要的范围不能包含在一个答案中。我建议阅读更多关于MVVM和WPF的内容,也许可以使用现有的框架,如MVVM Light或Caliburn.Micro。谢谢你的一些想法,我甚至不知道如何开始。我将使用一些属性创建ViewModel。我还有一个问题:如果我创建ViewModel和属性,即TextBloc_body和EllipseAngle,并将它们绑定到模板上,那么如果我对每个循环文字进行更改,会发生什么情况。当我给属性赋值并保持相同的值时,模板会将它们绑定,否则所有属性都会得到上一次属性更改的值??ViewModel中的属性不起作用。我的意思是它可以工作,但是所有的文本块都有上一次读写更改属性的文本。如何使每个选项卡上的TextBlock具有不同的文本?