EditableDesignerRegion Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Representa uma região de conteúdo editável dentro da marcação de tempo de design para o controle associado.
public ref class EditableDesignerRegion : System::Web::UI::Design::DesignerRegion
public class EditableDesignerRegion : System.Web.UI.Design.DesignerRegion
type EditableDesignerRegion = class
inherit DesignerRegion
Public Class EditableDesignerRegion
Inherits DesignerRegion
- Herança
- Derivado
Exemplos
Este exemplo mostra como criar um controle com duas regiões clicáveis e um EditableDesignerRegion objeto com dois modos de exibição ou modelos. Compile o projeto e abra a página em um designer visual e alterne para o modo de exibição WYSIWYG (design). Há duas exibições clicáveis, View1 e View2. Clique em Exibir1 e arraste o CheckBox controle da parte inferior da página para a região de designer vazia logo abaixo das regiões clicáveis. Clique em Exibir2 e arraste o RadioButton controle para a região vazia do designer. Clique em Exibir1 novamente e a região com o CheckBox reaparecer. Clique em Exibir2 e na região com os RadioButton reaparecimentos. Volte para o modo de exibição de origem para ver como as alterações são mantidas na marcação HTML
Observação
Seu projeto deve ter uma referência ao assembly System.Design.dll.
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.Design;
using System.Web.UI.Design.WebControls;
using System.Web.UI.WebControls;
namespace Samples.ASPNet.ControlDesigners_CS
{
[
Designer(typeof(MyMultiRegionControlDesigner)),
ToolboxData("<{0}:MyMultiRegionControl runat=\"server\" width=\"200\"></{0}:MyMultiRegionControl>")
]
public class MyMultiRegionControl : CompositeControl
{
// Define the templates that represent 2 views on the control
private ITemplate _view1;
private ITemplate _view2;
// Create persistable inner properties
// for the two editable views
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue(null)]
public virtual ITemplate View1
{
get { return _view1; }
set { _view1 = value; }
}
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue(null)]
public virtual ITemplate View2
{
get { return _view2; }
set { _view2 = value; }
}
// The current view on the control; 0 = view1, 1 = view2
private int _currentView = 0;
public int CurrentView
{
get { return _currentView; }
set { _currentView = value; }
}
// Create a simple table with a row of two clickable,
// readonly headers and a row with a single column, which
// is the 'container' to which we'll be adding controls.
protected override void CreateChildControls()
{
// Always start with a clean form
Controls.Clear();
// Create a table using the control's declarative properties
Table t = new Table();
t.CellSpacing = 1;
t.BorderStyle = BorderStyle;
t.Width = this.Width;
t.Height = this.Height;
// Create the header row
TableRow tr = new TableRow();
tr.HorizontalAlign = HorizontalAlign.Center;
tr.BackColor = Color.LightBlue;
// Create the first cell in the header row
TableCell tc = new TableCell();
tc.Text = "View 1";
tc.Width = new Unit("50%");
tr.Cells.Add(tc);
// Create the second cell in the header row
tc = new TableCell();
tc.Text = "View 2";
tc.Width = new Unit("50%");
tr.Cells.Add(tc);
t.Rows.Add(tr);
// Create the second row for content
tr = new TableRow();
tr.HorizontalAlign = HorizontalAlign.Center;
// This cell represents our content 'container'
tc = new TableCell();
tc.ColumnSpan = 2;
// Add the current view content to the cell
// at run-time
if (!DesignMode)
{
Control containerControl = new Control();
switch (CurrentView)
{
case 0:
if (View1 != null)
View1.InstantiateIn(containerControl);
break;
case 1:
if (View2 != null)
View2.InstantiateIn(containerControl);
break;
}
tc.Controls.Add(containerControl);
}
tr.Cells.Add(tc);
t.Rows.Add(tr);
// Add the finished table to the Controls collection
Controls.Add(t);
}
}
//---------------------------------------------------------
// Region-based control designer for the above web control,
// derived from CompositeControlDesigner.
public class MyMultiRegionControlDesigner : CompositeControlDesigner
{
private MyMultiRegionControl myControl;
public override void Initialize(IComponent component)
{
base.Initialize(component);
myControl = (MyMultiRegionControl)component;
}
// Make this control resizeable on the design surface
public override bool AllowResize
{
get
{
return true;
}
}
// Use the base to create child controls, then add region markers
protected override void CreateChildControls() {
base.CreateChildControls();
// Get a reference to the table, which is the first child control
Table t = (Table)myControl.Controls[0];
// Add design time markers for each of the three regions
if (t != null)
{
// View1
t.Rows[0].Cells[0].Attributes[DesignerRegion.DesignerRegionAttributeName] = "0";
// View2
t.Rows[0].Cells[1].Attributes[DesignerRegion.DesignerRegionAttributeName] = "1";
// Editable region
t.Rows[1].Cells[0].Attributes[DesignerRegion.DesignerRegionAttributeName] = "2";
}
}
// Handler for the Click event, which provides the region in the arguments.
protected override void OnClick(DesignerRegionMouseEventArgs e)
{
if (e.Region == null)
return;
// If the clicked region is not a header, return
if (e.Region.Name.IndexOf("Header") != 0)
return;
// Switch the current view if required
if (e.Region.Name.Substring(6, 1) != myControl.CurrentView.ToString())
{
myControl.CurrentView = int.Parse(e.Region.Name.Substring(6, 1));
base.UpdateDesignTimeHtml();
}
}
// Create the regions and design-time markup. Called by the designer host.
public override String GetDesignTimeHtml(DesignerRegionCollection regions) {
// Create 3 regions: 2 clickable headers and an editable row
regions.Add(new DesignerRegion(this, "Header0"));
regions.Add(new DesignerRegion(this, "Header1"));
// Create an editable region and add it to the regions
EditableDesignerRegion editableRegion =
new EditableDesignerRegion(this,
"Content" + myControl.CurrentView, false);
regions.Add(editableRegion);
// Set the highlight for the selected region
regions[myControl.CurrentView].Highlight = true;
// Use the base class to render the markup
return base.GetDesignTimeHtml();
}
// Get the content string for the selected region. Called by the designer host?
public override string GetEditableDesignerRegionContent(EditableDesignerRegion region)
{
// Get a reference to the designer host
IDesignerHost host = (IDesignerHost)Component.Site.GetService(typeof(IDesignerHost));
if (host != null)
{
ITemplate template = myControl.View1;
if (region.Name == "Content1")
template = myControl.View2;
// Persist the template in the design host
if (template != null)
return ControlPersister.PersistTemplate(template, host);
}
return String.Empty;
}
// Create a template from the content string and
// put it in the selected view.
public override void SetEditableDesignerRegionContent(EditableDesignerRegion region, string content)
{
if (content == null)
return;
// Get a reference to the designer host
IDesignerHost host = (IDesignerHost)Component.Site.GetService(typeof(IDesignerHost));
if (host != null)
{
// Create a template from the content string
ITemplate template = ControlParser.ParseTemplate(host, content);
// Determine which region should get the template
// Either 'Content0' or 'Content1'
if (region.Name.EndsWith("0"))
myControl.View1 = template;
else if (region.Name.EndsWith("1"))
myControl.View2 = template;
}
}
}
}
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Drawing
Imports System.Web.UI
Imports System.Web.UI.Design
Imports System.Web.UI.Design.WebControls
Imports System.Web.UI.WebControls
Namespace Samples.ASPNet.ControlDesigners_VB
< _
Designer(GetType(MyMultiRegionControlDesigner)), _
ToolboxData("<{0}:MyMultiRegionControl runat=""server"" width=""200""></{0}:MyMultiRegionControl>") _
> _
Public Class MyMultiRegionControl
Inherits CompositeControl
' Define the templates that represent 2 views on the control
Private _view1 As ITemplate
Private _view2 As ITemplate
' The current view on the control; 0 = view1, 1 = view2
Private _currentView As Integer = 0
' Create persistable inner properties
<PersistenceMode(PersistenceMode.InnerProperty), DefaultValue(CType(Nothing, ITemplate))> _
Public Overridable Property View1() As ITemplate
Get
Return _view1
End Get
Set(ByVal value As ITemplate)
_view1 = value
End Set
End Property
<PersistenceMode(PersistenceMode.InnerProperty), DefaultValue(CType(Nothing, ITemplate))> _
Public Overridable Property View2() As ITemplate
Get
Return _view2
End Get
Set(ByVal value As ITemplate)
_view2 = value
End Set
End Property
Public Property CurrentView() As Integer
Get
Return _currentView
End Get
Set(ByVal value As Integer)
_currentView = value
End Set
End Property
' Create a simple table with a row of two clickable,
' readonly headers and a row with a single column, which
' is the 'container' to which we'll be adding controls.
Protected Overrides Sub CreateChildControls()
' Start with a clean form
Controls.Clear()
' Create a table
Dim t As New Table()
t.CellSpacing = 1
t.BorderStyle = BorderStyle
t.Width = Me.Width
t.Height = Me.Height
' Create the header row
Dim tr As New TableRow()
tr.HorizontalAlign = HorizontalAlign.Center
tr.BackColor = Color.LightBlue
' Create the first cell in the header row
Dim tc As New TableCell()
tc.Text = "View 1"
tc.Width = New Unit("50%")
tr.Cells.Add(tc)
' Create the second cell in the header row
tc = New TableCell()
tc.Text = "View 2"
tc.Width = New Unit("50%")
tr.Cells.Add(tc)
t.Rows.Add(tr)
' Create the second row for content
tr = New TableRow()
tr.HorizontalAlign = HorizontalAlign.Center
' This cell represents our content 'container'
tc = New TableCell()
tc.ColumnSpan = 2
' Add the current view content to the cell
' at run-time
If Not DesignMode Then
Dim containerControl As New Control()
Select Case CurrentView
Case 0
If Not (View1 Is Nothing) Then
View1.InstantiateIn(containerControl)
End If
Case 1
If Not (View2 Is Nothing) Then
View2.InstantiateIn(containerControl)
End If
End Select
tc.Controls.Add(containerControl)
End If
tr.Cells.Add(tc)
t.Rows.Add(tr)
' Add the finished table to the Controls collection
Controls.Add(t)
End Sub
End Class
' Region-based control designer for the above web control.
' This is derived from CompositeControlDesigner.
Public Class MyMultiRegionControlDesigner
Inherits CompositeControlDesigner
Private myControl As MyMultiRegionControl
Public Overrides Sub Initialize(ByVal component As IComponent)
MyBase.Initialize(component)
myControl = CType(component, MyMultiRegionControl)
End Sub
' Make this control resizeable on the design surface
Public Overrides ReadOnly Property AllowResize() As Boolean
Get
Return True
End Get
End Property
' Use the base to create child controls, then add region markers
Protected Overrides Sub CreateChildControls()
MyBase.CreateChildControls()
' Get a reference to the table, which is the first child control
Dim t As Table
t = CType(myControl.Controls(0), Table)
' Add design time markers for each of the three regions
If Not IsNothing(t) Then
' View1
t.Rows(0).Cells(0).Attributes(DesignerRegion.DesignerRegionAttributeName) = "0"
' View2
t.Rows(0).Cells(1).Attributes(DesignerRegion.DesignerRegionAttributeName) = "1"
' Editable region
t.Rows(1).Cells(0).Attributes(DesignerRegion.DesignerRegionAttributeName) = "2"
End If
End Sub
' Handler for the Click event, which provides the region in the arguments.
Protected Overrides Sub OnClick(ByVal e As DesignerRegionMouseEventArgs)
If IsNothing(e.Region) Then
Return
End If
' If the clicked region is not a header, return
If e.Region.Name.IndexOf("Header") <> 0 Then
Return
End If
' Switch the current view if required
If e.Region.Name.Substring(6, 1) <> myControl.CurrentView.ToString() Then
myControl.CurrentView = Integer.Parse(e.Region.Name.Substring(6, 1))
MyBase.UpdateDesignTimeHtml()
End If
End Sub
' Create the regions and design-time markup. Called by the designer host.
Public Overrides Function GetDesignTimeHtml(ByVal regions As DesignerRegionCollection) As String
' Create 3 regions: 2 clickable headers and an editable row
regions.Add(New DesignerRegion(Me, "Header0"))
regions.Add(New DesignerRegion(Me, "Header1"))
' Create an editable region and add it to the regions
Dim editableRegion As EditableDesignerRegion = _
New EditableDesignerRegion(Me, _
"Content" & myControl.CurrentView, False)
regions.Add(editableRegion)
' Set the highlight for the selected region
regions(myControl.CurrentView).Highlight = True
' Use the base class to render the markup
Return MyBase.GetDesignTimeHtml()
End Function
' Get the content string for the selected region. Called by the designer host?
Public Overrides Function GetEditableDesignerRegionContent(ByVal region As EditableDesignerRegion) As String
' Get a reference to the designer host
Dim host As IDesignerHost = CType(Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
If Not IsNothing(host) Then
Dim template As ITemplate = myControl.View1
If region.Name = "Content1" Then
template = myControl.View2
End If
' Persist the template in the design host
If Not IsNothing(template) Then
Return ControlPersister.PersistTemplate(template, host)
End If
End If
Return String.Empty
End Function
' Create a template from the content string and put it
' in the selected view. Called by the designer host?
Public Overrides Sub SetEditableDesignerRegionContent(ByVal region As EditableDesignerRegion, ByVal content As String)
If IsNothing(content) Then
Return
End If
' Get a reference to the designer host
Dim host As IDesignerHost = CType(Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
If Not IsNothing(host) Then
' Create a template from the content string
Dim template As ITemplate = ControlParser.ParseTemplate(host, content)
' Determine which region should get the template
If region.Name.EndsWith("0") Then
myControl.View1 = template
ElseIf region.Name.EndsWith("1") Then
myControl.View2 = template
End If
End If
End Sub
End Class
End Namespace
<%@ Page Language="C#" %>
<%@ Register TagPrefix="aspSample"
Assembly="Samples.ASPNet.ControlDesigners_CS"
Namespace="Samples.ASPNet.ControlDesigners_CS" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Designers Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<aspSample:MyMultiRegionControl ID="myCtl" Runat=Server Width=200 Height=75 BorderStyle=solid >
</aspSample:MyMultiRegionControl><br />
<asp:CheckBox ID="CheckBox1" runat="server" />
<asp:RadioButton ID="RadioButton1" runat="server" />
</div>
</form>
</body>
</html>
<%@ Page Language="VB" %>
<%@ Register TagPrefix="aspSample"
Assembly="Samples.ASPNet.ControlDesigners_VB"
Namespace="Samples.ASPNet.ControlDesigners_VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Designers Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<aspSample:MyMultiRegionControl ID="myCtl" Runat=Server Width=200 Height=75 BorderStyle=solid >
</aspSample:MyMultiRegionControl><br />
<asp:CheckBox ID="CheckBox1" runat="server" />
<asp:RadioButton ID="RadioButton1" runat="server" />
</div>
</form>
</body>
</html>
Comentários
Use a EditableDesignerRegion classe para ajudar a gerenciar modelos em tempo de design. Um ControlDesigner usará uma instância dessa classe com seu GetEditableDesignerRegionContent método para gerar marcação HTML do conteúdo da região.
Construtores
EditableDesignerRegion(ControlDesigner, String) |
Inicializa uma nova instância da classe EditableDesignerRegion usando o nome e o proprietário fornecidos. |
EditableDesignerRegion(ControlDesigner, String, Boolean) |
Cria uma nova instância da classe EditableDesignerRegion usando o nome e o proprietário fornecidos e o valor inicial da propriedade ServerControlsOnly. |
Propriedades
Content |
Obtém ou define a marcação HTML para o conteúdo da região. |
Description |
Obtém ou define a descrição para uma região de designer. (Herdado de DesignerRegion) |
Designer |
Obtém o componente de designer associado. (Herdado de DesignerObject) |
DisplayName |
Obtém ou define o nome de exibição para uma região de designer. (Herdado de DesignerRegion) |
EnsureSize |
Obtém ou define um valor que indica se o tamanho da região deve ser definido explicitamente na região de designer pelo host de design. (Herdado de DesignerRegion) |
Highlight |
Obtém ou define um valor que indica se a região de designer deve ser realçada na superfície de design. (Herdado de DesignerRegion) |
Name |
Obtém o nome do objeto. (Herdado de DesignerObject) |
Properties |
Obtém as propriedades do objeto. (Herdado de DesignerObject) |
Selectable |
Obtém ou define um valor que indica se a região de designer pode ser selecionada pelo usuário na superfície de design. (Herdado de DesignerRegion) |
Selected |
Obtém ou define um valor que indica se a região de designer está atualmente selecionada na superfície de design. (Herdado de DesignerRegion) |
ServerControlsOnly |
Obtém ou define um valor que indica se a região pode aceitar apenas controles de servidor Web. |
SupportsDataBinding |
Obtém ou define um valor que indica se a região pode ser associada a uma fonte de dados. |
UserData |
Obtém ou define os dados de usuário opcionais a serem associados com a região de designer. (Herdado de DesignerRegion) |
Métodos
Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
GetBounds() |
Recupera o tamanho da região de designer na superfície de design. (Herdado de DesignerRegion) |
GetChildViewRendering(Control) |
Retorna um objeto ViewRendering que contém a marcação HTML do tempo de design para o controle fornecido. |
GetHashCode() |
Serve como a função de hash padrão. (Herdado de Object) |
GetService(Type) |
Obtém um serviço de host de design, conforme identificado pelo tipo fornecido. (Herdado de DesignerObject) |
GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
MemberwiseClone() |
Cria uma cópia superficial do Object atual. (Herdado de Object) |
ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
Implantações explícitas de interface
IServiceProvider.GetService(Type) |
Para obter uma descrição desse membro, confira GetService(Type). (Herdado de DesignerObject) |