5

プロジェクトをTemplate10に適応させると、App.xaml で継承されたスタイルがクラッシュします。

Template10のように見えますが、継承または拡張されたスタイルをサポートしていません。TitleStyleからSubTitleStyleを拡張しようとしましたが、 XamlTypeInfo.g.csのGetXamlTypeでCOM 例外が発生します。

私の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;
    }
}

私の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()
4

1 に答える 1

2

これは私を深く混乱させました。これで簡単に再現できました。そして、テンプレート 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>

つまり、アプリではなくページで作業を行うということです。では、XAML プラットフォームを修正せずに Template 10 を修正するにはどうすればよいでしょうか? 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 を修正して更新します。

幸運を祈ります、ジェリー

于 2016-03-08T02:16:59.003 に答える