Archive for the ‘Silverlight’ tag
Avoid incorrect Silverlight XAP file caching
The code below appends the last-write filedate of the Silverlight Application XAP file to the path in the source parametre of the Silverlight object tag.
This will ensure that poorly constructed caching functionality of webbrowsers and proxy servers doesn’t incorrectly use old, wrong builds of the XAP file.
However it will still allow these caches to work. Furthermore a check is performed to avoid XAP file path alteration during debugging, this is to allow debugging tools such as Silverlight Spy to continue functioning.
<object id="Xaml1" data="data:application/x-silverlight-2," type="application/x-silverlight-2"
width="100%" height="100%">
<%––<param name="source" value="ClientBin/SilverlightApp.xap"/>––%>
<%
string orgSourceValue = @"ClientBin/SilverlightApp.xap";
string param;
if (System.Diagnostics.Debugger.IsAttached)
param = "<param name=\"source\" value=\"" + orgSourceValue + "\" />";
else
{
string xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + orgSourceValue;
DateTime xapCreationDate = System.IO.File.GetLastWriteTime(xappath);
param = "<param name=\"source\" value=\"" + orgSourceValue + "?ignore="
+ xapCreationDate.ToString() + "\" />";
}
Response.Write(param);
%>
<param name="onError" value="onSilverlightError" />
FocusHelper
Here is a little helper class I use when implementing tab navigation in Silverlight. When FocusHelper.Start() is called at application startup it simply creates a timer which attempts to give the focused element a red border and a slightly red background. When I say attempts it’s because themes and styles may prevent the changes from showing. I have often found it helpful, because it is almost never clear which element in Silverlight has the focus. Notice that the functionality is disabled if your browser’s zoom is different from 100%.
public static class FocusHelper
{
public static void Start()
{
focusBorderBrush = new SolidColorBrush(Colors.Red);
focusBackground = new SolidColorBrush(Colors.Red);
focusBackground.Opacity = 0.1;
focusTimer = new Timer(new TimerCallback((o) =>
{
try
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
object temp = null;
if (System.Windows.Application.Current.Host.Content.ZoomFactor==1)
temp = FocusManager.GetFocusedElement();
if (temp != lastFocus)
{
if (temp is Control)
{
//Give the last control back its original color
if (lastFocus != null)
{
lastFocus.BorderBrush = lastBrush;
lastFocus.BorderThickness = lastThickness;
lastFocus.Background = lastBackground;
}
lastFocus = temp as Control;
lastBrush = lastFocus.BorderBrush;
lastThickness = lastFocus.BorderThickness;
lastBackground = lastFocus.Background;
lastFocus.BorderBrush = focusBorderBrush;
lastFocus.BorderThickness = new Thickness(1);
lastFocus.Background = focusBackground;
}
}
});
}
catch
{
}
}), null, 0, 100);
}
private static System.Threading.Timer focusTimer;
private static Control lastFocus = null;
private static Thickness lastThickness;
private static Brush lastBrush;
private static Brush lastBackground;
private static Brush focusBorderBrush;
private static Brush focusBackground;
}