UWP Inherit от Control - PullRequest
       33

UWP Inherit от Control

1 голос
/ 24 сентября 2019

Например, у меня есть UserControl, например:

<UserControl x:Class="SMPlayer.ScrollingTextBlock">
    <ScrollViewer
        x:Name="TextScrollViewer"
        HorizontalScrollBarVisibility="Hidden"
        PointerEntered="TextScrollViewer_PointerEntered"
        VerticalScrollBarVisibility="Disabled">
        <StackPanel>
            <TextBlock x:Name="NormalTextBlock" />
            <TextBlock x:Name="PointerOverTextBlock" Visibility="Collapsed" />
        </StackPanel>
    </ScrollViewer>
</UserControl>

Я хочу, чтобы это UserControl все еще считалось нормальным TextBlock.Например <ScrollingTextBlock Text="Something"/>.Это просто TextBlock с большим количеством функций или, другими словами, другой элемент управления, который наследуется от TextBlock.Поскольку свойств много, я не хочу делать это вручную, добавляя DependencyProperty и делая такие вещи, как public string Text { get; set; }.Это просто слишком много работы.

Как мне этого добиться?Я думаю, что этот вопрос можно было задать, но я не уверен, как правильно перефразировать его.

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Если вы хотите реализовать <ScrollingTextBlock Text="Something"/> в UserControl, вам все равно нужно добавить DependencyProperty для достижения этого.

1 голос
/ 24 сентября 2019

Если вы хотите, чтобы ваш элемент управления "рассматривался как нормальный TextBlock", то у вас нет другого выбора, кроме как наследоваться от TextBlock.Это то, для чего предназначено наследование.

В противном случае вам действительно нужно добавить свойства к вашему UserControl и связать их самостоятельно, хотя это большая работа, это связано с плохой гибкостью UserControl.У вас не может быть свойства Text для объекта, если он не наследуется от TextBlock или вы не добавили его самостоятельно.

В качестве альтернативы вы можете использовать шаблоны для повторного шаблонирования ContentControl, например:

public class ScrollingContent : ContentControl { }
<Window.Resources>
    <Style TargetType="local:ScrollingContent">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:ScrollingContent">
                    <ScrollViewer
                        x:Name="TextScrollViewer"
                        HorizontalScrollBarVisibility="Hidden"
                        VerticalScrollBarVisibility="Disabled">
                        <StackPanel>
                            <TextBlock x:Name="NormalTextBlock" />
                            <ContentPresenter></ContentPresenter>
                        </StackPanel>
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <local:ScrollingContent>
        <TextBlock Text="Whatever control I want" Foreground="Red"></TextBlock>
    </local:ScrollingContent>
</Grid>

Но опять же, ваш контроль на самом деле не TextBlock.

...