Получить статический ресурс, определенный в Silverlight 4 XAML, с помощью метода расширения, который не работает должным образом - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь извлечь элемент 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);
    }
...

Я думаю, что код достаточно прост в своей цели, чтобы быть понятным.

Приступая к делу, что не так с подходом метода расширения?Просматривая гугл и сам ТА, мне кажется, оба метода должны работать.

Что мне не хватает?

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Как я выяснил после дополнительных исследований по этому вопросу, то, что я хочу сделать (взять что-нибудь и положить его куда-либо), невозможно сделать с помощью методов расширения , поскольку они не изменят "this«параметр, если это тип значения (функциональная парадигма, которую они предоставляют, склоняется к неизменности, или мне так сказали).

Вот то, что я придумал, похоже, что я не стану ближе:1005 *

public static T GetStaticResource<T>(string resourceKey) where T : class
        {
            if (Application.Current.Resources.Contains(resourceKey))
                return Application.Current.Resources[resourceKey] as T;
            else
                return null;
        }
1 голос
/ 08 марта 2012

попробуйте

 public static void ApplyStyleResourceExt<T>(this T obj, string resourceKey) where T : FrameworkElement
        {
            if (Application.Current.Resources.Contains(resourceKey))
                obj.Style  = Application.Current.Resources[resourceKey] as Style;
            else
                obj.Style = null;
        }

используйте вот так:

ret.ApplyStyleResourceExt("contentTextStyle");
...