Wpf - 构造函数中的Template属性为null

时间:2018-03-13 11:15:30

标签: c# wpf xaml styles datatemplate

初始化类之后,template属性返回正确的值,但在构造函数中它始终返回null。我试图在构造函数中调用ApplyTemplate()方法,但它不起作用。 谁能解释为什么会发生这种情况? 是否可以正确获取构造函数中的模板属性? 提前谢谢!

风格

 <Style x:Key="DesignerItemStyle" TargetType="{x:Type dataModel:Component}">
        <Style.Resources>
            <converter:ComponentHeightConverter x:Key="componentHeightConverter"/>
        </Style.Resources>
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
        <Setter Property="MinWidth" Value="10"/>
        <Setter Property="MinHeight" Value="10"/>
        <Setter Property="Height" Value="5"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type dataModel:Component}">
                    <StackPanel Orientation="Vertical"  DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">

                        <Grid x:Name="PART_MainGrid">

                            <!-- PART_ContentPresenter -->
                            <ContentPresenter x:Name="PART_ContentPresenter"
                                          HorizontalAlignment="Stretch"
                                          VerticalAlignment="Stretch"
                                          Content="{TemplateBinding ContentControl.Content}"
                                          Margin="{TemplateBinding ContentControl.Padding}"
                                          Cursor="Arrow"/>

                            <!-- PART_ResizeDecorator -->
                            <Control x:Name="PART_ResizeDecorator" 
                                 Visibility="Collapsed"
                                 Template="{StaticResource ResizeDecoratorTemplate}"/>

                            <!-- PART_DragThumb -->
                            <c:DragThumb x:Name="PART_DragThumb"
                                     Template="{StaticResource MoveThumbTemplate}"
                                     ToolTip="{Binding ToolTip}"
                                     Cursor="SizeAll"/>

                            <c:RelativePositionPanel x:Name="PART_ConnectorNames" 
                                                     Visibility="{Binding Path=(viewModel:ToolbarViewModel.IsPortLabelVisible), 
                                                                  Converter={StaticResource BooleanToVisibilityConverter}}"/>

                            <!-- PART_ConnectorDecorator -->
                            <Control x:Name="PART_ConnectorDecorator"
                                 Visibility="Visible" Panel.ZIndex="1000"
                                 Template="{StaticResource ConnectorDecoratorTemplate}"/>

                        </Grid>
                        <TextBlock x:Name="PART_NameBlock"
                                   HorizontalAlignment="Center" Visibility="{Binding Path=(viewModel:ToolbarViewModel.IsComponentLabelVisible), Converter={StaticResource BooleanToVisibilityConverter}}"
                                   TextTrimming="CharacterEllipsis" Text="{Binding DisplayedName}" Grid.Row="1">
                            <TextBlock.RenderTransform>
                                <TranslateTransform X="5" Y="5"/>
                            </TextBlock.RenderTransform>
                        </TextBlock>
                    </StackPanel>
                    <ControlTemplate.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Value="True" Binding="{Binding RelativeSource={RelativeSource Self},Path=IsSelected}"/>
                                <Condition Value="{x:Static sys:Guid.Empty}" Binding="{Binding RelativeSource={RelativeSource Self},Path=ParentID}"/>
                            </MultiDataTrigger.Conditions>
                            <Setter TargetName="PART_ResizeDecorator" Property="Visibility" Value="Visible"/>
                        </MultiDataTrigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter TargetName="PART_ConnectorDecorator" Property="Visibility" Value="Visible"/>
                            <Setter TargetName="PART_DragThumb" Property="Visibility" Value="Visible"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter TargetName="PART_DragThumb" Property="Visibility" Value="Visible"/>
                        </Trigger>
                        <DataTrigger Value="True" Binding="{Binding RelativeSource={RelativeSource Self},Path=IsDragConnectionOver}">
                            <Setter TargetName="PART_ConnectorDecorator" Property="Visibility" Value="Visible"/>
                        </DataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

    </Style>

具体类

   public Component() 
    { 
        var template = this.Template; //Here template property returns null
    }

2 个答案:

答案 0 :(得分:1)

您可以在此方法中覆盖OnApplyTemplate方法和访问模板。

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        var template = Template; // template is not null here
    }

答案 1 :(得分:0)

您可以在访问 Template 属性之前调用 UpdateDefaultStyle()方法。 例如:

var button= new Button();
button.UpdateDefaultStyle();
button.Template // template is not null here