Dnes jsem si dal trochu pauzu od toho předělávání starších Windows Forms programů na WPF, protože mě to ukrutně nebavilo se prodírat kódy, o kterých jsem nevěděl proč jsem je kdysi tak naprogramoval a přemýšlel jsem jak trochu oživit ten svůj web.
Napadlo mě že bych mohl udělat barevnou lištu a tu vložit na každou stránku někde. Naprogramovat celé toto mi trvalo asi 4h.
Prvně co jsem udělal bylo že jsem si to promyslel a došel jsem k závěru, že by byla hloupost abych tuto lištu generoval pro každou stránku zvlášť a proto jsem se rozhodl, že jednu barevnou lištu budou sdílet všechny rozlišení.
Pak jsem začal programovat. Začal jsem s třídou GeneralHelper. Nejtěžší bylo naprogramovat metodu CalculatePercentOfColorBars, která jednorázově při spuštění webu vypočte podle parametrů které jí předáte šířku v % pro jednotlivé barvy a samozřejmě se zde přiřadí každému divu unikátní barva.
U mě to sice může vypadat že to jsou stejné barvy na pohled, ale stačí si je dát pod kapátko a zjistíte že i když se liší třeba jen o “1” tak se liší. A samozřejmě tu je ještě pole colorsColorBar, které obsahuje tolik barev, kolik maximálně zadáte jako druhý argument metodě .
Nezapomeňte, že každá barva tam může být jen jednou!
GeneralHelper.cs
CODEstatic string[] colorsColorBar = new string[] { "#3FB1F0",
...
};
/// <summary>
/// V klici bude rozliseni pro ktere se vztahuje, v hodnote pak pole s cisly, ktere budou vyjadrovat % z dostupne sirky ktere barva zabere
/// </summary>
public static Dictionary<short, byte[]=""> percentOfCountBars = new Dictionary<short, byte[]="">();
/// <summary>
/// V klici bude rozliseni, v hodnote pak barvy ke poli, ktere je na stejnem klici jako zde barvy v slovniku percentOfCountBars
/// </summary>
public static Dictionary<short, List=""></short,><string>> colorsOfBars = new Dictionary<short, List=""></short,><string>>();
public static void CalculatePercentOfColorBars(short width, int pocet)
{
List<string> barvyFinal = new List<string>(pocet);
List<string> colors = new List<string>(colorsColorBar);
byte percent = 100;
byte percent2 = 0;
int pocet2 = pocet;
pocet2--;
byte[] b = new byte[pocet];
byte i = 1;
for (; i < 10; i++)
{
b[i - 1] = i;
int indexBarvy = RandomHelper.RandomInt2(0, colors.Count);
barvyFinal.Add(colors[indexBarvy]);
colors.RemoveAt(indexBarvy);
pocet--;
percent2 += i;
percent -= i;
}
//
while (percent > 0 && pocet != 0)
{
if (percent == 2)
{
break;
}
byte r = RandomHelper.RandomByte2(1, percent > 9 ? 9 : percent);
if (r > percent)
{
continue;
}
b[i - 1] = r;
int indexBarvy = RandomHelper.RandomInt2(0, colors.Count);
barvyFinal.Add(colors[indexBarvy]);
colors.RemoveAt(indexBarvy);
pocet--;
percent2 += r;
percent -= r;
if (percent < 0)
{
break;
}
i++;
if (percent < 10 && percent != 0)
{
for (int i2 = 1; i2 < percent + 1; i2++)
{
int dex = i - 1;
if (dex > pocet2)
{
break;
}
b[dex] = 1;
indexBarvy = RandomHelper.RandomInt2(0, colors.Count);
barvyFinal.Add(colors[indexBarvy]);
colors.RemoveAt(indexBarvy);
pocet--;
if (pocet == 0)
{
break;
}
percent2 += 1;
percent -= 1;
if (percent < 0)
{
break;
}
i++;
}
}
}
//-Zaverecna korekce
if (percent2 < 100)
{
i++;
int pomer = 100 - percent2;
if (b.Length == i + 1)
{
b[i] = (byte)pomer;
int indexBarvy = RandomHelper.RandomInt2(0, colors.Count);
barvyFinal.Add(colors[indexBarvy]);
}
else
{
b[0] += (byte)pomer;
}
}
int nt = 0;
for (int i3 = 0; i3 < b.Length; i3++)
{
nt += b[i3];
}
if (nt > 100)
{
int pomer = nt - 100;
b[8] -= (byte)pomer;
}
byte[] b2 = null;
int b2l = barvyFinal.Count;
if (b2l == b.Length)
{
b2 = b;
}
else
{
b2 = new byte[b2l];
for (int y = 0; y < b2l; y++)
{
b2[y] = b[y];
}
}
b2 = CA.JumbleUp<byte>(b2);
percentOfCountBars.Add(width, b2);
colorsOfBars.Add(width, barvyFinal);
}
Druhé místo kde musíte něco dopsat je Global.asax. Ten je vždy v rootu vašeho webového projektu – jen tam se bude správně spouštět při inicializaci startu vaší webové aplikace.
Global.asax(metoda Application_Start)
CODEGeneralHelper.CalculatePercentOfColorBars(800, 25);
GeneralHelper.CalculatePercentOfColorBars(840, 30);
//-short.MaxValue se bude pouzivat pokud chci umistit MultiColorLine na celou sirku stranky
GeneralHelper.CalculatePercentOfColorBars(short.MaxValue, 36);
Další místem kde musíte něco naprogramovat je třída MultiColorLine. Tato třída zodpovídá za vygenerování odpovídajícího HTML obsahu s barevnou lištou. Třídu HtmlGenerator vám tu dávat nebudu, odpovídající metody si zvládnete jistě naprogramovat sami:
MultiColorLine.cs
CODEusing System.Collections.Generic;
public class MultiColorLine
{
public static string GetHtml(short width)
{
byte[] sirky = GeneralHelper.
percentOfCountBars[width];
List<string> colors = GeneralHelper.colorsOfBars[width];
HtmlGenerator hg = new HtmlGenerator();
int bl = sirky.Length - 1;
for (int i = 0; i < bl; i++)
{
hg.WriteTagWith2Attrs("div", "class", "partColorBar", "style", "width:" + sirky[i] + "%;background-color:" + colors[i]);
hg.TerminateTag("div");
}
hg.WriteTagWith2Attrs("div", "class", "partColorBar", "style", "width:" + sirky[bl] + "%;background-color:" + colors[bl] + ";float:right;");
hg.TerminateTag("div");
return hg.ToString();
}
} </string>
Předposlední místo je pak samotná (Master)Page ve které zavoláte . Ve stránce na odpovídající místo vložte tento div a případně naslytujte podle vlastního uvážení:
Neco.Master
CODE<div id="divBarevnaLista" runat="server"></div>
Ve code behindu pak dejte následující kód(pouze si upravte jak chcete mít lištu širokou v 1. argumentu), který vytvoří HTML kód a vloží vám jej jako vnitřek divu.
Neco.Master.cs
CODEdivBarevnaLista.InnerHtml = MultiColorLine.GetHtml(800);
Ve stránce, případně externím CSS pak musíte mít i toto CSS:
Neco.css
CODE.partColorBar {
height: 5px;
max-height: 5px;
min-height: 5px;
display: inline-block;
padding: 0;
margin: 0;
float: left;
}
Posledním kódem který vám tu dám jsou ty další metody které jsem volal, abyste nemuseli tápat, jak je implementovat:
CODEinternal static T[] JumbleUp<T>(T[] b)
{
int bl = b.Length;
for (int i = 0; i < bl; ++i)
{
int index1 = (RandomHelper.RandomInt() % bl);
int index2 = (RandomHelper.RandomInt() % bl);
T temp = b[index1];
b[index1] = b[index2];
b[index2] = temp;
}
return b;
}
public static class RandomHelper
{
static Random rnd = new Random();
internal static int RandomInt2(int od, int to)
{
return rnd.Next(od, to);
}
internal static byte RandomByte2(int od, int to)
{
return (byte)rnd.Next(od, to);
}
}
Výsledek?

