隐藏表单的 DoubleBuffered 属性而不使其失效 [英] Hide form's DoubleBuffered property without make it nonfunctional

查看:27
本文介绍了隐藏表单的 DoubleBuffered 属性而不使其失效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 Class 我试图从表单的属性窗口中隐藏 DoubleBuffered 属性,但没有使其不起作用.所以我在下面的代码示例中做了类似的事情......然而,DoubleBuffered 属性仍然出现.那么,我们真的可以隐藏 DoubleBuffered 属性吗?如果是,我们该怎么做?

导入 System.ComponentModel导入 System.ComponentModel.Design公共类 MyForm继承形式<可浏览(假)>公共重载属性 DoubleBuffered 作为布尔值得到返回 MyBase.DoubleBuffered结束获取Set(ByVal value As Boolean)MyBase.DoubleBuffered = 值结束集最终财产公共子新建()Me.DoubleBuffered = True结束子结束类

解决方案

您可以为您的 Form 创建一个自定义组件设计器,但要重新创建无法访问的 System.Windows.Forms 的功能,这是一项艰巨的任务.Design.FormDocumentDesigner.更简单的方法是使用我之前向您展示的 Form 的 Site 属性来访问设计器服务.

在这种情况下,您需要覆盖

Using a Class I am trying to hide the DoubleBuffered property from form's property window but without make it nonfunctional. So I did something like this in code example below... Ηowever, DoubleBuffered property still appears. So, can we really hide DoubleBuffered property and if yes, how can we do that?

Imports System.ComponentModel
Imports System.ComponentModel.Design

Public Class MyForm
    Inherits Form

    <Browsable(False)>
    Public Overloads Property DoubleBuffered As Boolean
        Get
            Return MyBase.DoubleBuffered
        End Get
        Set(ByVal value As Boolean)
            MyBase.DoubleBuffered = value
        End Set
    End Property

    Public Sub New()
        Me.DoubleBuffered = True
    End Sub

End Class

解决方案

You could create a custom component designer for your Form, but that is a daunting task to just recreate the functionality of the inaccessible System.Windows.Forms.Design.FormDocumentDesigner. The simpler way is use the Form's Site property as I have shown you before to access the designer services.

In this case, you need to override the ITypeDescriptorFilterService service of the designer host. This service is used by the designer for all type discovery/filtering operations and is not limited to a specific component.

The first step is to create a class that implements ITypeDescriptorFilterService. The following is one such implementation. It is a generic implementation that allows it to filter components of the specified type and takes list of property names that you want to exclude from the PropertyGrid display. The final item it requires is a reference to the existing service used by the designer host.

Friend Class FilterService(Of T) : Implements ITypeDescriptorFilterService
    Private namesOfPropertiesToRemove As String()

    Public Sub New(baseService As ITypeDescriptorFilterService, ParamArray NamesOfPropertiesToRemove As String())
        Me.BaseService = baseService
        Me.namesOfPropertiesToRemove = NamesOfPropertiesToRemove
    End Sub

    Public ReadOnly Property BaseService As ITypeDescriptorFilterService
    Public Function FilterAttributes(component As IComponent, attributes As IDictionary) As Boolean Implements ITypeDescriptorFilterService.FilterAttributes
        Return BaseService.FilterAttributes(component, attributes)
    End Function

    Public Function FilterEvents(component As IComponent, events As IDictionary) As Boolean Implements ITypeDescriptorFilterService.FilterEvents
        Return BaseService.FilterEvents(component, events)
    End Function

    Public Function FilterProperties(component As IComponent, properties As IDictionary) As Boolean Implements ITypeDescriptorFilterService.FilterProperties
        ' ref: ITypeDescriptorFilterService Interface: https://msdn.microsoft.com/en-us/library/system.componentmodel.design.itypedescriptorfilterservice(v=vs.110).aspx
        ' 
        ' The return value of FilterProperties determines if this set of properties is fixed.
        ' If this method returns true, the TypeDescriptor for this component can cache the 
        ' results. This cache is maintained until either the component is garbage collected or the Refresh method of the type descriptor is called.

        ' allow other filters 1st chance to modify the properties collection
        Dim ret As Boolean = BaseService.FilterProperties(component, properties)

        ' only remove properties if component is of type T
        If TypeOf component Is T AndAlso Not (properties.IsFixedSize Or properties.IsReadOnly) Then
            For Each propName As String In namesOfPropertiesToRemove
                ' If the IDictionary object does not contain an element with the specified key, 
                ' the IDictionary remains unchanged. No exception is thrown.
                properties.Remove(propName)
            Next
        End If
        Return ret
    End Function
End Class

Example Usage in Form:

Imports System.ComponentModel
Imports System.ComponentModel.Design

Public Class TestForm : Inherits Form
    Private host As IDesignerHost
    Private altTypeDescriptorProvider As FilterService(Of TestForm)

    ' spelling and character casing of removedPropertyNames is critical
    ' it is a case-sensative lookup
    Private Shared removedPropertyNames As String() = {"DoubleBuffered"}

    Public Overrides Property Site As ISite
        Get
            Return MyBase.Site
        End Get
        Set(value As ISite)
            If host IsNot Nothing Then
                UnwireDesignerCode()
            End If

            MyBase.Site = value
            If value IsNot Nothing Then
                host = CType(Site.GetService(GetType(IDesignerHost)), IDesignerHost)
                If host IsNot Nothing Then
                    If host.Loading Then
                        AddHandler host.LoadComplete, AddressOf HostLoaded
                    Else
                        WireUpDesignerCode()
                    End If
                End If
            End If
        End Set
    End Property

    Private Sub HostLoaded(sender As Object, e As EventArgs)
        RemoveHandler host.LoadComplete, AddressOf HostLoaded
        WireUpDesignerCode()
    End Sub

    Private Sub WireUpDesignerCode()
        AddFilter()
    End Sub

    Private Sub UnwireDesignerCode()
        If host IsNot Nothing Then
            RemoveFilter()
        End If
        host = Nothing
    End Sub

    Private Sub AddFilter()
        Dim baseFilter As ITypeDescriptorFilterService = CType(host.GetService(GetType(ITypeDescriptorFilterService)), ITypeDescriptorFilterService)
        If baseFilter IsNot Nothing Then
            ' remove existing filter service
            host.RemoveService(GetType(ITypeDescriptorFilterService))
            ' create our replacement service and add it to the host's services
            altTypeDescriptorProvider = New FilterService(Of TestForm)(baseFilter, removedPropertyNames)
            host.AddService(GetType(ITypeDescriptorFilterService), altTypeDescriptorProvider)
            TypeDescriptor.Refresh(Me.GetType) ' force a type description rescan 
        End If
    End Sub

    Private Sub RemoveFilter()
        If altTypeDescriptorProvider IsNot Nothing Then
            host.RemoveService(GetType(ITypeDescriptorFilterService))
            host.AddService(GetType(ITypeDescriptorFilterService), altTypeDescriptorProvider.BaseService)
            altTypeDescriptorProvider = Nothing
        End If
    End Sub
End Class

Now when you create a form that inherits from TestForm, the DoubleBuffered property will be excluded from the PropertyGrid display.

这篇关于隐藏表单的 DoubleBuffered 属性而不使其失效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆