【问题标题】:Border doesn't inherit Control, so how does a setter on Control.Background work?Border 不继承 Control,那么 Control.Background 上的 setter 是如何工作的呢?
【发布时间】:2013-09-06 09:53:42
【问题描述】:

由于 Border 不是从 Control 派生的,它是如何工作的?

    <Border.Style>
        <Style>
            <Style.Setters>
                <Setter Property="Control.Background" Value="LightBlue"/>
            </Style.Setters>
        </Style>
    </Border.Style>

【问题讨论】:

    标签: .net wpf inheritance border controls


    【解决方案1】:

    Background WPF 中的依赖属性由许多类共享。在Panel类中定义,其他类直接调用AddOwner就可以了。

    Border.cs

    [CommonDependencyProperty]
    public static readonly DependencyProperty BackgroundProperty =
        Panel.BackgroundProperty.AddOwner(
            typeof (Border),
            new FrameworkPropertyMetadata(null,
                FrameworkPropertyMetadataOptions.AffectsRender |
                FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender));
    

    Panel.cs

    [CommonDependencyProperty] 
    public static readonly DependencyProperty BackgroundProperty =
        DependencyProperty.Register("Background", 
            typeof(Brush),
            typeof(Panel),
            new FrameworkPropertyMetadata((Brush)null,
                FrameworkPropertyMetadataOptions.AffectsRender | 
                FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender));
    

    【讨论】:

    • @franssu 没有魔法,我刚刚使用 Resharper 反编译了 Border 类(还有 Reflector 和其他反编译器)。 .NET Framework 源代码也可以...不时使用。
    【解决方案2】:

    可以与用户交互的类Control。这包括类:TextBoxButton 等。引用自 MSDN

    Control 类是您添加到应用程序的许多控件的基类。 Control 类定义了非常少的行为;虽然可以将 Control 添加到您的应用程序,但更常见的是添加从 Control 继承的控件,例如 Button 或 ListBox。

    他还添加了一个依赖属性,如BackgroundFontFamilyForeground等,这些属性在System.Windows.Controls中的所有控件都可用。完整的属性列表是here。他还代表用户界面 (UI) 元素的基类,这些元素使用 ControlTemplate 来定义其外观。

    让我们看看Border上的继承层次结构,MSDN上的链接:

    System.Object 
     System.Windows.Threading.DispatcherObject
      System.Windows.DependencyObject
       System.Windows.Media.Visual
        System.Windows.UIElement
         System.Windows.FrameworkElement
          System.Windows.Controls.Decorator
           System.Windows.Controls.Border
    

    它在System.Windows.Controls 中,因此,它继承了Control 可用的所有属性。

    【讨论】:

    • “它在 System.Windows.Controls 中,因此它继承了 Control 可用的所有属性。”为什么?
    • @franssu:以WinForms 为例,每个可视化组件都称为Control。在 WPF 中不是。例如,Panel 不是控件,但它具有从Control 类继承的属性。这会导致一些混乱。在显示的层次结构中,Border 直接派生自FrameworkElement,但它没有BackgroundFontFamily 等属性。因此,在System.Windows.Controls 中找到的所有元素,隐式或显式地继承Control 类中可用的属性。
    • 谢谢,但是你是怎么发现的?它写在 MSDN 上的任何地方吗?这是标准做法吗?
    • @franssu:关于评论,基本上,在书中Matthew MacDonald: Pro WPF in C#link,在第一章。我建议他们阅读,一本非常好的书。
    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 2012-09-01
    • 2016-08-31
    • 1970-01-01
    • 2017-07-05
    • 2023-03-23
    • 1970-01-01
    • 2018-11-10
    相关资源
    最近更新 更多