/ / Чи можливо успадкувати XAML? - c #, wpf, xaml, спадкування

Чи можливо успадкувати XAML? - c #, wpf, xaml, спадкування

У мене є контролери користувачів, які успадковують базовий клас, який виглядає приблизно так:

BasePage.cs:

using System.Windows.Controls;

namespace TestPageManager23434
{
public class BasePage : UserControl
{
public string ButtonPreviousText { get; set; }
public string ButtonNextText { get; set; }

protected PageManager pageManager;

public BasePage(PageManager pageManager)
{
this.pageManager = pageManager;
}
}
}

А користувач керує таким чином:

XAML:

<local:BasePage x:Class="TestPageManager23434.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:TestPageManager23434"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Background="White"
Width="400"
Height="400"
>
<TextBlock Text="this is page1"/>
<TextBlock Text="{Binding Message}"/>
<Button Content="go to page 2" Click="Button_Click"
HorizontalAlignment="Left"
Width="200"
Height="30"
/>
</StackPanel>
</local:BasePage>

Код позаду:

using System.Windows.Controls;

namespace TestPageManager23434
{
public partial class Page1 : BasePage
{
public string Message { get; set; }

public Page1(PageManager pageManager) : base(pageManager)
{
InitializeComponent();
DataContext = this;
}

private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
pageManager.SwitchPage("page2");
}
}
}

Але тепер у моїх частинах XAML моїх різних UserControls я також є Блоки XAML чого я також хотів би наслідувати з базового класу, щоб я не копіював цей блок у кожен файл XAML:

<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Left">
<Button
Content="{Binding ButtonPreviousText}"
Width="150"
Margin="5"
Click="ButtonPrevious_Click"/>
<Button
Content="{Binding ButtonNextText}"
Width="150"
Click="ButtonNext_Click" Margin="5"/>
</StackPanel>

Але оскільки в моєму базовому класі немає XAML, я бачу два способи:

  • створити їх у коді в моєму базовому класі
  • створити для них контролі користувачів

Або є інший спосіб розмістити цей XAML в одному місці або якимось чином успадкувати XAML?

Відповіді:

4 для відповіді № 1

Я пропоную прочитати WPF Огляд контролю авторських прав на MSDN. Я не думаю, що ти зможеш досягти того, що ти намагаєшся робити особливо з UserControls. UserControls, як правило, призначені склеювати певний набір елементів управління, таким чином, щоб вони були послідовно використані в межах єдине додаток. Вони насправді не призначені для спадкування.

Одне, що ви можете зробити, - це використовувати їх у свого родуМода "MasterPage" (якщо ви ознайомилися з ASP.NET). Ви можете помістити ContentControls всередину "базового" UserControl і виявити різні властивості, які дозволяють інжекторам вводити вміст у стандартний макет базового елемента управління. Таким чином, ваш інший UserControl "поставив" базу "UserControl як кореневий елемент всередині себе та встановив різні властивості вмісту для будь-яких елементів, які вони хочуть.


1 для відповіді № 2

У вашому прикладі це звучить, що вам було б найкраществорюється елемент управління під назвою "NavigationControl", а потім використовувати його в кожному з елементів управління, а не копіювати цей самий блок. Без трохи більше контексту та специфіки важко дати хороше рішення.


0 для відповіді № 3

Ну, ви можете написати xaml, а потім використовувати XamlReader щоб проаналізувати xaml до об’єктів, це дає вам переваги написання XML замість коду.


0 для відповіді № 4

Якщо в кожному контрольному елементі є такі спільні елементи, ви можете зробити користувачеві керування спільними елементами та використовувати його всередині іншого керування користувачем.

По-друге, я бачу, що у вас є якийсь бізнеслогіка в загальному пункті, однак спосіб події написання ділової логіки трохи старший, вам слід розглянути можливість створення команд та виконання команд. Для цього знадобиться трохи більше вивчення, але це дозволить легко розробляти більші проекти.