我正在开发Windows手机7.5 - 8.0应用。 通常,我需要根据来自数据绑定的值从资源字典中选择一些资源。
首先我这样做了:
public class EventValueConverter: IValueConverter
{
public delegate object ConvertEventHandler( EventValueConverter sender, object value );
object IValueConverter.Convert( object value, Type targetType, object parameter, CultureInfo culture )
{
var eh = this.Convert;
if( null == eh )
{
Logger.warning( "EventValueConverter.Convert is not set - returning null." );
return null;
}
return eh( this, value );
}
object IValueConverter.ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
{
throw new NotSupportedException();
}
public event ConvertEventHandler Convert;
}
将转换器添加到页面资源中,并在后面的页面代码中实现了事件:
public object myConverter_Convert( EventValueConverter converter, object val )
{
return this.Resources[ val.ToString() ];
}
效果很好。问题是Blend不喜欢我的转换器,说“错误HRESULT E_FAIL已经从调用COM组件返回”。它在打开页面时发生,并且消息显示在我的页面的位置,从而使Blend无法用于该页面。
然而,我喜欢Blend。这就是为什么我为同样的任务创建了另一个转换器的原因:
public class PageResourceConverter: IValueConverter
{
object IValueConverter.Convert( object value, Type targetType, object parameter, CultureInfo culture )
{
if( null == value )
return null;
string name = value.ToString();
if( String.IsNullOrEmpty( name ) )
return null;
object res = null;
var page = getCurrentPage();
if( null == page )
return null;
res = page.Resources[ name ];
if( null == res )
{
Logger.warning( "Resource {0} was not found", name );
return null;
}
return res;
}
object IValueConverter.ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
{
throw new NotSupportedException();
}
internal static PhoneApplicationPage getCurrentPage()
{
if( Global.inFormDesigner ) return null;
return ( (PhoneApplicationFrame)Application.Current.RootVisual ).Content as PhoneApplicationPage;
}
}
这也行得通。并且它不会使Blend崩溃。但是,它在设计模式下不起作用,因为Application.Current.RootVisual为null。如何使它在设计模式下工作?
或者,从转换器返回资源的正确方法是什么?我不想为每种类型的枚举+我需要解析为样式或画笔或其他资源的每种字符串ID创建单独的转换器。