Как создать UserControl, который поддерживает другой элемент внутри него в коде XAML - PullRequest
1 голос
/ 11 октября 2019

Мне нравится вставлять другие FrameworkElements в мой UserControl, но если я делаю это в коде XAML, элемент управления работает неправильно. (Мне нужно сделать как Panel/Grid тип control). Другими словами, он потерял contents. Как решить эту проблему? Я нашел несколько примеров, но они не работают в UWP. Я хочу, чтобы следующий пример был очень простым, чтобы показать, что я имею в виду и что мне нужно.

XAML

<!--THE CONTROL-->
<local:TestControl Width="300" Height="300">
    <!--LIKE TO ADD THIS ONE INSIDE THE CONTROL-->
    <TextBlock Text="Some Text"></TextBlock>
</local:TestControl>

XAML ДЛЯ УПРАВЛЕНИЯ

<UserControl
    x:Class="MyApp.TestControl"
    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"
    mc:Ignorable="d"

    d:DesignHeight="300"
    d:DesignWidth="400">

    <Grid Background="DarkGray" BorderBrush="Black" BorderThickness="2" CornerRadius="10"></Grid>
</UserControl>

КОД ЗАД

namespace MyApp
{
    public sealed partial class TestControl : UserControl
    {
        public TestControl()
        {
            this.InitializeComponent();
        }
    }
}

1 Ответ

3 голосов
/ 11 октября 2019

Замените UserControl на шаблонный элемент управления.

  1. Создайте класс с именем TestControl, который наследуется от ContentControl:

    public sealed class TestControl : ContentControl
    {
        public TestControl() => DefaultStyleKey = typeof(TestControl);
    }
    
  2. Создайте папку themes в своем проекте и добавьте ResourceDictinonary с именем generic.xaml в эту папку. Имя themes/generic.xaml важно для того, чтобы фреймворк мог его найти. В этом файле вы определяете шаблон для своего элемента управления:

    <Style TargetType="local:TestControl">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:TestControl">
                    <Grid Background="DarkGray" BorderBrush="Black" BorderThickness="2" CornerRadius="10">
                        <ContentPresenter />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
  3. Создайте экземпляр своего элемента управления, как раньше:

    <local:TestControl Width="300" Height="300">
        <!--LIKE TO ADD THIS ONE INSIDE THE CONTROL-->
        <TextBlock Text="Some Text"></TextBlock>
    </local:TestControl>
    

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * [*] * * * * * * * *

* * * * *1031* * *1031* * * *1031* в журнале @Jerry Nixon *1033* для получения дополнительной информации о создании пользовательскихконтроля.

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