Я пытаюсь извлечь элемент Application.Resources из кода позади, и я озадачен, так как выполнение этого с помощью метода расширения, похоже, не работает, с другой стороны, превращая точно такой же метод в «нормальный» метод.преуспевает.
Позвольте мне отметить, что это почти исключительно нацелено на самообучение в разработке Silverlight.
Чего я хочу добиться, так это получить Style
(определяемый как ресурс) для универсального TextBlock
из XAML через кодовый код.
Это свойство (оно определено внутри App.xaml
)
<Application.Resources>
<Style x:Key="contentTextStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="White" />
</Style>
[...]
Как видите, это простое свойство "покрасить текстовый блок в белый цвет".
Вот«нормальный» метод:
public static class ApplicationResources
{
public static T RetrieveStaticResource<T>(string resourceKey) where T : class
{
if(Application.Current.Resources.Contains(resourceKey))
return Application.Current.Resources[resourceKey] as T;
else
return null;
}
...
Это код в виде метода расширения:
public static class ApplicationResources
{
public static void RetrieveStaticResourceExt<T>(this T obj, string resourceKey) where T : class
{
if(Application.Current.Resources.Contains(resourceKey))
obj = Application.Current.Resources[resourceKey] as T;
else
obj = null;
}
...
Это вызывающая сторона для методов выше (обратите внимание, это другой класс , но оба живут в одном и том же пространстве имен ):
public static class UIElementsGenerator
{
/// <summary>
/// Appends a TextBlock to 'container', name and text can be provided (they should be, if this is used more than once...)
/// </summary>
public static void AddTextBlock(this StackPanel container, string controlName = "newTextBlock", string text = "")
{
TextBlock ret = new TextBlock();
ret.Text = controlName + ": " + text;
ret.TextWrapping = TextWrapping.Wrap;
//This uses the 1st non-extension method, this **WORKS** (textblock turns out white)
ret.Style = MyHelper.RetrieveStaticResource<Style>("contentTextStyle");
//This uses the 2nd one, and **DOESN'T WORK** (textbox stays black)
ret.Style.RetrieveStaticResourceExt<Style>("contentTextStyle");
container.Children.Add(ret);
}
...
Я думаю, что код достаточно прост в своей цели, чтобы быть понятным.
Приступая к делу, что не так с подходом метода расширения?Просматривая гугл и сам ТА, мне кажется, оба метода должны работать.
Что мне не хватает?