特定条件下特定计算机上的样式出现奇怪错误

时间:2014-05-09 12:14:03

标签: c# .net wpf c#-4.0 .net-4.0

在我的设置中,我们有一个wpf应用程序,其中app.xaml设置了一些样式。那么这个文件有一个包含更多样式的合并字典。到目前为止一切顺利。

应用程序有几个窗口,最终打开另一个窗口,该窗口位于同一解决方案(我们的视图)中的另一个DLL中。视图中的窗口使用基本的{StaticResource MyResource},它们可以完美地看到应用程序项目的字典。

现在我有一个按钮样式模板,其中包含内容中的路径,X为自定义关闭按钮,如下所示:

 <Style x:Key="MetroCloseButton" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="#FFC10000"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Padding" Value="10 5"/>
        <Setter Property="BorderThickness" Value="1" />
        <Setter Property="Content">
            <Setter.Value>
                <Path Data="F1M54.0573,47.8776L38.1771,31.9974 54.0547,16.1198C55.7604,14.4141 55.7604,11.6511 54.0573,9.94531 52.3516,8.23962 49.5859,8.23962 47.8802,9.94531L32.0026,25.8229 16.1224,9.94531C14.4167,8.23962 11.6511,8.23962 9.94794,9.94531 8.24219,11.6511 8.24219,14.4141 9.94794,16.1198L25.8255,32 9.94794,47.8776C8.24219,49.5834 8.24219,52.3477 9.94794,54.0534 11.6511,55.7572 14.4167,55.7585 16.1224,54.0534L32.0026,38.1745 47.8802,54.0534C49.5859,55.7585 52.3516,55.7572 54.0573,54.0534 55.7604,52.3477 55.763,49.5834 54.0573,47.8776z" Stretch="Uniform" Fill="White" Width="12" Margin="0,0,0,0" ></Path>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Border x:Name="Border" CornerRadius="3" Background="{TemplateBinding Background}" BorderBrush="Black" SnapsToDevicePixels="True" BorderThickness="{TemplateBinding BorderThickness}" />
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter Property="OpacityMask" Value="DarkRed"/>
                            <Setter Property="Margin" Value="2 1" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="BorderThickness" Value="0"/>
                            <Setter TargetName="Border" Property="Background" Value="#FFFF3A3A"/>
                            <Setter Property="Foreground" Value="White"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter TargetName="Border" Property="Background" Value="#FFEFEFEF"/>
                            <Setter TargetName="Border" Property="BorderBrush" Value="LightGray"/>
                            <Setter Property="Foreground" Value="#FF9E9E9E"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

在窗口中,无论是应用程序项目还是DLL视图,它们都使用以下方法来应用样式:

<Button Name="cmdClose" Style="{StaticResource MetroCloseButton}" Margin="5" HorizontalAlignment="Right" Width="80" Click="cmdClose_Click"/>

现在的问题是,有些电脑可以完美运行。其他电脑,当我第一次像魅力一样打开窗户时,然后关闭窗口并重新打开它然后崩溃,异常

Set property 'System.Windows.FrameworkElement.Style' threw an exception.

此错误不会被try catch捕获,并且在从EXE运行时不会显示消息。它在Window wnd = new Window();

上失败了

现在抓住这个问题,如果我将风格放入<Window.Resource>本身,那么窗口打开和关闭完全适用#1。经过更多的测试,我发现如果删除内容:

<Setter Property="Content">
            <Setter.Value>
                <Path Data="F1M54.0573,47.8776L38.1771,31.9974 54.0547,16.1198C55.7604,14.4141 55.7604,11.6511 54.0573,9.94531 52.3516,8.23962 49.5859,8.23962 47.8802,9.94531L32.0026,25.8229 16.1224,9.94531C14.4167,8.23962 11.6511,8.23962 9.94794,9.94531 8.24219,11.6511 8.24219,14.4141 9.94794,16.1198L25.8255,32 9.94794,47.8776C8.24219,49.5834 8.24219,52.3477 9.94794,54.0534 11.6511,55.7572 14.4167,55.7585 16.1224,54.0534L32.0026,38.1745 47.8802,54.0534C49.5859,55.7585 52.3516,55.7572 54.0573,54.0534 55.7604,52.3477 55.763,49.5834 54.0573,47.8776z" Stretch="Uniform" Fill="White" Width="12" Margin="0,0,0,0" ></Path>
            </Setter.Value>
        </Setter>

因此,如果我删除路径,我可以保持app.xaml中的样式,它完美地工作。所以我有一个样式中的<Path />的错误,在某些计算机的整个应用程序生命周期中不能使用两次。到目前为止,50%的人工作50%没有工作。我们还通过简单的图像跟踪该问题,例如:

<BitmapImage x:Key="Image_Print" UriSource="Images\Print.png" />

以上不适用于第二次在具有按钮样式问题的计算机上使用。

我们正在开发VS2010,如果可能有帮助,我们正在运行4.0个完整个人资料。 好像微软的bug。现在我们唯一的解决方案就是将每个样式复制粘贴到每个单独的窗口和用户控制资源中,并且可以正常工作。

我们不会手动改变字典。资源是只读的。

修改

我们在计算机Windows\Microsoft.NET\Framework\WPF\上注意到问题是缺少某些文件,例如PresentationCore.DLL。我们在其中一台计算机上安装了.Net 4.5运行时,并创建了缺失的DLL。现在安装了.NET 4.5,问题完全消失了,因此问题与微软有关。问题是我们无法使用VS2010部署.Net 4.5应用程序,所以我仍然需要一个解决方案来修补.NET 4.0

1 个答案:

答案 0 :(得分:0)

我们选择远程协助,在全球范围内手动安装.net 4.5到600-650用户,直到我们为新的Visual Studio上的所有开发人员获得新许可的预算。我们的目标是保持这个直到.net 5.0不会陷入另一个像这样的愚蠢.net问题。