【问题标题】:UWP Inherit from ControlUWP 从控件继承
【发布时间】:2020-01-24 14:43:28
【问题描述】:

例如我有一个这样的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。例如&lt;ScrollingTextBlock Text="Something"/&gt;。它只是一个具有更多功能的TextBlock,或者换句话说,另一个继承自TextBlock 的控件。因为有很多属性,我不想通过添加DependencyProperty 来手动执行此操作并执行public string Text { get; set; } 之类的操作。工作量太大了。

我怎样才能做到这一点?我想可能有人问过这个问题,但我不知道如何正确解释它。

【问题讨论】:

    标签: c# xaml uwp win-universal-app


    【解决方案1】:

    如果要在UserControl中实现&lt;ScrollingTextBlock Text="Something"/&gt;,还需要添加DependencyProperty来实现。

    【讨论】:

      【解决方案2】:

      如果您希望您的控件“被视为普通的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

      【讨论】:

      • 这只是我想要的一个例子。它是否是TextBlock 并不重要。我只是希望它被这样对待。
      猜你喜欢
      • 1970-01-01
      • 2021-05-19
      • 2010-11-10
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多