2017-02-22 55 views
1

我有以下的ControlTemplate内访问控制:WPF,不能在控件模板

<UserControl x:Class="WpfSinergoHMIControls.Controlli.ControlButton" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfSinergoHMIControls.Controlli" 
     mc:Ignorable="d"> 

<UserControl.Template> 
    <ControlTemplate TargetType="UserControl" x:Name="ControlButtonTemplate"> 
     <Grid Background="Black" Name="ControlButtonGrid"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="2*" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="1*" /> 
       <RowDefinition Height="2*" /> 
      </Grid.RowDefinitions> 

      <Label Content="{TemplateBinding Content}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Background="White" Margin="1,1,1,1" Grid.Row="0"></Label> 
      <Viewbox Grid.Row="1" Margin="0" HorizontalAlignment="Center" VerticalAlignment="Center"> 
       <Ellipse Width="100" Height="100" Fill="White" Margin="0" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
      </Viewbox> 
      <Viewbox Grid.Row="1" Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"> 
       <Ellipse Width="100" Height="100" Margin="0" Name="InnerEllipse" Fill="Black" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      </Viewbox> 
     </Grid> 
    </ControlTemplate> 
</UserControl.Template> 

,我想以编程方式访问称为“InnerEllipse”的对象。

我尝试用下面的代码行这样做:

Ellipse InnerEllipse = (Ellipse) this.Template.FindName("InnerEllipse", this); 

这就是所谓的“ControlButton”类中所谓的“颜色”属性里面:

public Color Color 
{ 
    set 
    { 
     Ellipse InnerEllipse = (Ellipse)this.Template.FindName("InnerEllipse", this); 
    } 
} 

财产“颜色'然后初始化当我使用'UserControl'

<Controlli:ControlButton Height="169" Width="119" Color="DarkGreen"/> 

问题是,功能“FindName”返回“null”。我找不出什么是缺失的。非常感谢你!

+0

你试过this.FindName(“InnerEllipse”,this.Template)? – Dbl

回答

0

问题是Color属性设置为之前模板已被应用。

Color应该是一个依赖属性。然后,您可以指定一个默认值以及钩住了PropertyChangedCallback每当它改变时被调用:

public partial class ControlButton : UserControl 
{ 
    public ControlButton() 
    { 
     InitializeComponent(); 
    } 

    Ellipse InnerEllipse; 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     InnerEllipse = (Ellipse)this.Template.FindName("InnerEllipse", this); 
    } 

    public static readonly DependencyProperty ColorProperty = 
     DependencyProperty.Register("Color", typeof(Color), 
     typeof(ControlButton), new FrameworkPropertyMetadata(Colors.DarkGreen, new PropertyChangedCallback(OnColorChanged))); 

    public Color Color 
    { 
     get { return (Color)GetValue(ColorProperty); } 
     set { SetValue(ColorProperty, value); } 
    } 

    private static void OnColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ControlButton ctrl = d as ControlButton; 
     if (ctrl.InnerEllipse != null) 
      ctrl.InnerEllipse.Fill = new SolidColorBrush() { Color = ctrl.Color }; 
    } 
} 
+0

我使用“OnApplyTemplate()”来获取“InnerEllipse”对象,并做任何我需要做的功能。谢谢! – Enrico