Posts Tagged ‘Rounded corners’
Image Corners Extender Control
The prevalent use of styled borders (e.g. rounded corners) by our designers have caused much debate amongst the developers as to which technique should be employed to achieve the desired result. The Backgrounds and Borders Module in CSS Level 3 would be ideal, but we have to wait until that becomes ubiquitous.
In this post, I present to you an extender control I created to add image corners to <asp:Panel> controls. The extender works by injecting additional <div> elements into the DOM and style each with a background image.
Below is the source code for the server-side extender control:
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
[assembly: WebResource("UPDN.ImageCornersBehavior.js", "text/javascript")]
namespace UPDN
{
///
///
[TargetControlType(typeof(Panel))]
public class ImageCornersExtender : ExtenderControl
{
public string TopBorderImageUrl { get; set; }
public string RightBorderImageUrl { get; set; }
public string BottomBorderImageUrl { get; set; }
public string LeftBorderImageUrl { get; set; }
public string TopLeftCornerImageUrl { get; set; }
public string TopRightCornerImageUrl { get; set; }
public string BottomLeftCornerImageUrl { get; set; }
public string BottomRightCornerImageUrl { get; set; }
public string MiddleImageUrl { get; set; }
protected override IEnumerable
{
var descriptor = new ScriptControlDescriptor(“UPDN.ImageCornersBehavior”, targetControl.ClientID);
var imageUrls = new Dictionary
if (!string.IsNullOrEmpty(TopBorderImageUrl))
imageUrls.Add(“t”, TopBorderImageUrl);
if (!string.IsNullOrEmpty(RightBorderImageUrl))
imageUrls.Add(“r”, RightBorderImageUrl);
if (!string.IsNullOrEmpty(BottomBorderImageUrl))
imageUrls.Add(“b”, BottomBorderImageUrl);
if (!string.IsNullOrEmpty(LeftBorderImageUrl))
imageUrls.Add(“l”, LeftBorderImageUrl);
if (!string.IsNullOrEmpty(TopLeftCornerImageUrl))
imageUrls.Add(“tl”, TopLeftCornerImageUrl);
if (!string.IsNullOrEmpty(TopRightCornerImageUrl))
imageUrls.Add(“tr”, TopRightCornerImageUrl);
if (!string.IsNullOrEmpty(BottomLeftCornerImageUrl))
imageUrls.Add(“bl”, BottomLeftCornerImageUrl);
if (!string.IsNullOrEmpty(BottomRightCornerImageUrl))
imageUrls.Add(“br”, BottomRightCornerImageUrl);
if (!string.IsNullOrEmpty(MiddleImageUrl))
imageUrls.Add(“m”, MiddleImageUrl);
descriptor.AddProperty(“imageUrls”, imageUrls);
yield return descriptor;
}
protected override IEnumerable
{
yield return new ScriptReference(“UPDN.ImageCornersBehavior.js”, this.GetType().Assembly.FullName);
}
}
}
And the source code for the client-side behavior:
Type.registerNamespace("UPDN");
UPDN.ImageCornersBehavior = function(element) {
UPDN.ImageCornersBehavior.initializeBase(this, [element]);
// keys: t, l, b, r, tl, tr, bl, br
this._imageUrls = null;
}
UPDN.ImageCornersBehavior.prototype = {
initialize: function() {
UPDN.ImageCornersBehavior.callBaseMethod(this, "initialize");
var el = this.get_element();
var imagesUrls = this.get_imageUrls();
var containers = [];
// create border elements
if (imagesUrls["t"]) {
var t = document.createElement("div");
t.style.background = "url(" + imagesUrls["t"] + ") repeat-x top left";
containers.push(t);
}
if (imagesUrls["r"]) {
var r = document.createElement("div");
r.style.background = "url(" + imagesUrls["r"] + ") repeat-y top right";
containers.push(r);
}
if (imagesUrls["b"]) {
var b = document.createElement("div");
b.style.background = "url(" + imagesUrls["b"] + ") repeat-x bottom left";
containers.push(b);
}
if (imagesUrls["l"]) {
var l = document.createElement("div");
l.style.background = "url(" + imagesUrls["l"] + ") repeat-y top left";
containers.push(l);
}
if (imagesUrls["tl"]) {
var tl = document.createElement("div");
tl.style.background = "url(" + imagesUrls["tl"] + ") no-repeat top left";
containers.push(tl);
}
if (imagesUrls["tr"]) {
var tr = document.createElement("div");
tr.style.background = "url(" + imagesUrls["tr"] + ") no-repeat top right";
containers.push(tr);
}
if (imagesUrls["bl"]) {
var bl = document.createElement("div");
bl.style.background = "url(" + imagesUrls["bl"] + ") no-repeat bottom left";
containers.push(bl);
}
if (imagesUrls["br"]) {
var br = document.createElement("div");
br.style.background = "url(" + imagesUrls["br"] + ") no-repeat bottom right";
containers.push(br);
}
if (containers.length > 0) {
// create content container
var m = document.createElement("div");
m.className = "content";
// move child elements of target element into content container
this._moveChildren(el, m);
// set middle image as background of target element
if (imagesUrls["m"]) {
el.style.background = "url(" + imagesUrls["m"] + ") repeat top left";
}
containers.push(m);
// inject containers into DOM
el.appendChild(containers[0]);
for (var i = 1; i < containers.length; i++) {
containers[i - 1].appendChild(containers[i]);
}
}
},
dispose: function() {
//Add custom dispose actions here
UPDN.ImageCornersBehavior.callBaseMethod(this, "dispose");
},
_moveChildren: function(srcEl, destEl) {
while (srcEl.hasChildNodes()) {
var child = srcEl.childNodes[0];
destEl.appendChild(child);
}
},
get_imageUrls: function() {
return this._imageUrls;
},
set_imageUrls: function(value) {
this._imageUrls = value;
}
}
UPDN.ImageCornersBehavior.registerClass("UPDN.ImageCornersBehavior", Sys.UI.Behavior);
To use the extender, place an <asp:Panel> control on the page:
<asp:Panel ID="Panel1" runat="server" CssClass="box1">
This box is styled using 8 images. Lorem ipsum no etiam perfecto his, per adhuc maiorum epicurei eu. Laoreet signiferumque in mel, ne vel dicat percipit instructior. An eum veniam decore perpetua, nam laudem praesent at. Exerci accumsan contentiones est ei, appetere gloriatur et qui, ea suscipit senserit consectetuer mei.
</asp:Panel>
Then add the extender, set the TargetControlID to the ID of the <asp:Panel> control, and specify the images required to achieve your design. For this panel, I require eight images, four for the borders and four for the corners:
<updn:ImageCornersExtender ID="ImageCornersExtender1" runat="server"
TargetControlID="Panel1"
TopBorderImageUrl="img/box1/t.gif"
RightBorderImageUrl="img/box1/r.gif"
BottomBorderImageUrl="img/box1/b.gif"
LeftBorderImageUrl="img/box1/l.gif"
TopLeftCornerImageUrl="img/box1/tl.gif"
TopRightCornerImageUrl="img/box1/tr.gif"
BottomLeftCornerImageUrl="img/box1/bl.gif"
BottomRightCornerImageUrl="img/box1/br.gif"
/>
Here is how the complete example looks like:

Download the source code and example from my SkyDrive.