GetTemplateChild возвращает ноль в OnApplyTemplate - PullRequest
0 голосов
/ 01 мая 2020

я создал класс для своих страниц с расширением ContentControl

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;

namespace WpfApp1
{
    public class page_controller : ContentControl
    {
        public string title { get; set; }
    }
}

, и это мое окно xaml:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style TargetType="{x:Type local:page_controller}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:page_controller}">
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="{Binding Path=title, RelativeSource={RelativeSource AncestorType=ContentControl}, Mode=TwoWay}"
                                       FontSize="24"
                                       TextWrapping="Wrap"
                                       Foreground="#FFfd8900"
                                       VerticalAlignment="Top"
                                       TextAlignment="Center" />
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>

        <local:page_controller x:Name="page_controller" title="default which i don't wan it !" />

    </Grid>
</Window>

здесь я создал стиль для моего контроллера страницы с текстовым блоком, который собирается напечатать 'title'

, и я назвал этот элемент 'page_controller'

, теперь в C# этого окна, я хочу сделать некоторые проверки и измените page_controller.title до появления окна! поэтому я сделал это

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        page_controller page;

        public MainWindow()
        {
            InitializeComponent();
        }

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

            string new_title = ....; // do some checks to set new title

            page = GetTemplateChild("page_controller") as page_controller; // Jesus ****** Christ ! ERROR !!! (page) is null !!!!!!

            page.title = new_title ; // error (crash (null)) !!
        }
    }
}

Я использовал GetTemplateChild в OnApplyTemplate, чтобы получить этот page_controller объект в xaml, который я назвал page_controller, но что-то не так !!! GetTemplateChild возвращает ноль !!!

1 Ответ

1 голос
/ 02 мая 2020

GetTemplateChild используется только для получения элемента изнутри Control х ControlTemplate.

page_controller не является частью MainWindow х ControlTemplate, это часть его Content. Вы можете ссылаться на элементы, определенные в содержимом Window, просто используя его Name в качестве имени переменной. У вас уже есть x:Name="page_controller", поэтому имя переменной page_controller.

Попробуйте в событии Window.Loaded:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    string new_title = ....; // do some checks to set new title
    page_controller.title = new_title;
}

Отдельное примечание: publi c имена свойств и типов должны быть написаны заглавными буквами с использованием «PascalCasing»:
MSDN - Соглашения об использовании заглавных букв

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...