【问题标题】:Visual Studio 2015 XAML designer view exceptionVisual Studio 2015 XAML 设计器视图异常
【发布时间】:2018-04-04 07:48:12
【问题描述】:

在我的 Visual Studio 2015 中,XAML 设计器视图无法加载 MainWindow.xaml,它非常大,资源的 Style.xaml 非常大。 它只发生在 x64 配置中,当我切换到 x86 并重新编译时就会消失。 我得到的例外是 InvalidOperationException:必须在 ShaderEffect 上设置 PixelShader。 堆栈跟踪不指向任何行号,并且没有列出我的代码的任何文件,所以这是一个死胡同。 该应用程序运行良好并显示 MainWindow 它只是设计器。 有时从 xaml 中删除一些行甚至一些空格似乎会使其加载,但只是暂时地,它最终会因“System.Runtime.Remoting.RemotingException:设计器进程意外终止!”而崩溃。

堆栈跟踪: 在 System.Windows.Media.Effects.ShaderEffect.ManualUpdateResource(通道通道,布尔型 skipOnChannelCheck) 在 System.Windows.Media.Effects.ShaderEffect.UpdateResource(通道通道,布尔型 skipOnChannelCheck) 在 System.Windows.Media.Effects.ShaderEffect.AddRefOnChannelCore(通道通道) 在 System.Windows.Media.Effects.Effect.System.Windows.Media.Composition.DUCE.IResource.AddRefOnChannel(通道通道) 在 System.Windows.Media.Visual.UpdateEffect(通道通道,ResourceHandle 句柄,VisualProxyFlags 标志,布尔 isOnChannel) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx,ResourceHandle 句柄) 在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 在 System.Windows.Media.Visual.Render(RenderContext ctx,UInt32 childIndex) 在 System.Windows.Media.CompositionTarget.Compile(频道频道) 在 System.Windows.Media.CompositionTarget.System.Windows.Media.ICompositionTarget.Render(布尔 inResize,通道通道) 在 System.Windows.Media.MediaContext.Render(ICompositionTarget resizedCompositionTarget) 在 System.Windows.Media.MediaContext.RenderMessageHandlerCore(对象 resizedCompositionTarget) 在 System.Windows.Media.MediaContext.RenderMessageHandler(对象 resizedCompositionTarget) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象 args,Int32 numArgs) 在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

【问题讨论】:

  • 是自定义效果吗(和ShaderEffect在同一个解决方案代码中)?
  • @David:不,它不是自定义着色器。我也不知道它指的是哪种效果。该 Style.xaml 中有许多效果,但它们都是标准的。

标签: xaml visual-studio-2015 designer


【解决方案1】:

我在 x64 配置上也有相同的堆栈跟踪。我决定只在我们不在设计模式下应用效果来解决这个问题。

在我的情况下,我希望在 IsEnabled=False 时显示为禁用的图像。添加一个额外的触发器来检查视图模型上的 NotInDesignMode 属性就可以了。

<Style x:Key="GreyImage" TargetType="{x:Type Image}">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=IsEnabled}" Value="False"/>
                <Condition Binding="{Binding Path=NotInDesignMode}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="Effect" >
                <Setter.Value>
                    <local:GreyscaleEffect DesaturationFactor="0.0" />
                </Setter.Value>
            </Setter>
            <Setter Property="Opacity" Value="0.5" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

我在主窗口的构造函数中设置了 NotInDesignMode,并将它作为我的视图模型基类中的静态属性。

bool notInDesignMode = !DesignerProperties.GetIsInDesignMode(this);

有趣的是,如果我使用 System.Windows.Media.Effects.BlurEffect 代替,我没有收到错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多