я создал класс для своих страниц с расширением 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
возвращает ноль !!!