При добавлении стиля BasedOn в App.xaml происходит сбой в App() { InitializeComponent(); }

Приспосабливая проект к Template10, я иду в унаследованные стили в App.xaml, вылетает.

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

My App.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;
    }
}

My 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()

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 приложения любого приложения. Boom. Сама ошибка возникает, когда мы пытаемся получить доступ к коллекции ресурсов, но только когда 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;
}

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

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

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

Другие вопросы по тегам