Добавление стиля на основе на основе App.xaml приводит к сбою в App() { InitializeComponent(); }

Адаптируя проект к Template10, я перехожу к унаследованным стилям в App. xaml падают.

Похоже на Template10, не поддерживает унаследованные или расширенные стили. Я пытался расширить SubTitleStyle из TitleStyle, но получаю исключения COM для GetXamlType в XamlTypeInfo.g.cs

Мое приложение.xaml.cs

sealed partial class App : BootStrapper
{
    public App() { InitializeComponent(); }

    public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args)
    {
        NavigationService.Navigate(typeof(ShellView))
        await Task.CompletedTask;
    }
}

Мой App.xaml

<Style x:Key="TitleStyle" TargetType="TextBlock">
    <Setter Property="Foreground" Value="{StaticResource TextTitleForeground}"/>
    <Setter Property="FontSize" Value="26"/>
    <Setter Property="TextWrapping" Value="Wrap"/>
    <Setter Property="FontWeight" Value="Medium"/>
</Style>
<Style x:Key="SubTitleStyle" TargetType="TextBlock" BasedOn="{StaticResource TitleStyle}">
    <Setter Property="Foreground" Value="{StaticResource TextForeground}"/>
    <Setter Property="FontSize" Value="20"/>
</Style>

Информация об исключении:

Error HRESULT E_FAIL has been returned from a call to a COM component.

at System.Runtime.InteropServices.WindowsRuntime.IIterator`1.MoveNext()
at System.Runtime.InteropServices.WindowsRuntime.IteratorToEnumeratorAdapter`1.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at Template10.Common.BootStrapper.<InitializeFrameAsync>d__77.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Template10.Common.BootStrapper.<InternalLaunchAsync>d__53.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_0(Object state)
at System.Threading.WinRTSynchronizationContext.Invoker.InvokeCore()

person soydachi    schedule 07.03.2016    source источник
comment
Пожалуйста, отредактируйте свой вопрос, чтобы он содержал ваш фактический исходный код. Не ссылайтесь на изображения вашего кода. Что касается вашей проблемы, вам следует более четко понимать, что происходит, когда вы запускаете свой код. Вы получаете сообщения об ошибках? Что они говорят?   -  person Kenster    schedule 07.03.2016
comment
Я обновляю свой вопрос более подробно. Приветствуются любые предложения для получения более подробной информации :). Спасибо!   -  person soydachi    schedule 08.03.2016


Ответы (1)


Это меня глубоко смущало. Мне было легко воспроизвести это. И затем я легко смог воспроизвести это без ссылки на шаблон 10. Код нарушения — это этот блок в T10:

// title
foreach (var resource in Application.Current.Resources
    .Where(x => x.Key.Equals(typeof(Controls.CustomTitleBar))))
{
    var control = new Controls.CustomTitleBar();
    control.Style = resource.Value as Style;
}

Вы можете упростить это до этого:

var a = Application.Current.Resources.ToArray();

Размещается в OnLaunched приложения любого приложения. Бум. Сама ошибка возникает, когда мы пытаемся получить доступ к коллекции ресурсов, но только тогда, когда к ресурсам добавлен стиль BasedOn.

После встречи с командой платформы, чтобы попытаться оправдать Шаблон 10, все за столом начали чесать в затылках. И именно тогда я понял, @dachibox, что вы обнаружили настоящую ошибку в платформе XAML.

Вот единственный текущий обходной путь, пока мы не обновим шаблон 10.

<Page.Resources>
    <ResourceDictionary Source="..\Styles\Custom.xaml" />
</Page.Resources>

Я имею в виду, что вы выполняете работу на странице, а не в приложении. Итак, как мы будем исправлять шаблон 10 без исправления платформы XAML? Взгляните на этот странный код, который мы будем использовать в Bootstrapper:

int count = Application.Current.Resources.Count;
foreach (var resource in Application.Current.Resources)
{
    var k = resource.Key;
    if (k == typeof(Controls.CustomTitleBar))
    {
        var s = resource.Value as Style;
        var t = new Controls.CustomTitleBar();
        t.Style = s;
    }
    count--;
    if (count == 0) break;
}

Ошибка, по крайней мере, заключается в свойстве count итератора, которое, кажется, увеличивается, а не уменьшается, когда вы выполняете итерацию по нему. Сумасшедший да? Оказывается, этот путь итерации не является распространенным вариантом использования. Но сейчас это не имеет значения, мы подняли флаг благодаря вашему вопросу здесь.

Я обновлю Шаблон 10 с исправлением где-то на этой неделе.

Удачи, Джерри

person Jerry Nixon    schedule 08.03.2016
comment
Ух ты! Я рад внести свой вклад в платформу XAML. Если вам нужна дополнительная информация, не стесняйтесь спрашивать меня. - person soydachi; 08.03.2016
comment
Вау, я только что столкнулся с той же ошибкой. Пока мои стили не BasedOn ничего другого, я могу идти. - person akshay2000; 08.03.2016