WPF: решите, где показывать contentPresenter в вашем пользовательском элементе управления - PullRequest
0 голосов
/ 13 февраля 2019

У меня очень простой UserControl с некоторыми границами и некоторыми украшениями, которые реагируют на mouseOver, нажатие и некоторые приятные вещи.

Я хочу позволить людям устанавливать содержимое текста извне, но когда яустановить содержимое, сгенерированный предъявитель содержимого перезаписывает всю мою структуру WPF.

Это то, что я пробовал до сих пор:

<UserControl tags tags tags>
    <!-- This is the only way I found to style the textblock that WPF -->
    <!-- generates to encapsulate the content string -->
    <UserControl.Template>
        <ControlTemplate TargetType="UserControl">
            <TextBlock Background="Green"
                       HorizontalAligment="Center"
                       VerticalAlignment="Center"
                       Text = "{TemplateBinding Content}"/>
        </ControlTemplate>
    </UserControl.Template>

    <!-- Here my borders and fancy things. I want to add animations -->
    <!-- and react to mouseOver and Pressed like a button -->

    <Border x:Name="SuperNiceBorder" tag tag tag>
        <HERE I WANT THE CONTENTPRESENTER>
    </Border>

</UserControl>

Есть ли способ сказать WPF, что я хочу, чтобы текст был установленпользователь в Контенте просто есть ???

1 Ответ

0 голосов
/ 13 февраля 2019

Переместите все свои анимации и триггеры в ControlTemplate.

Замените ваш TextBlock на ContentPresenter:

<UserControl x:Class="MySolution.MyControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <UserControl.Template>
        <ControlTemplate TargetType="UserControl">
            <Border x:Name="MyBorder" Background="Green">
            <ContentPresenter
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       Content = "{TemplateBinding Content}"/></Border>

            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter TargetName="MyBorder" Property="Background" Value="Red"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </UserControl.Template>

</UserControl>

И вы можете использовать UserControl, как в следующих примерах:

1:

    <local:MyControl Content="Test Testing tester"/>

2:

    <local:MyControl>
        <TextBlock Text="Another test from a TextBlock"/>
    </wpfAllPurposesTest:MyControl>
...