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

本文关键字:错误 条件下 计算机 样式 | 更新日期: 2023-09-27 18:02:44

在我的设置中,我们有一个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中保留样式,它可以完美地工作。所以我有一个bug,似乎像<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

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

我们选择远程协助手动安装。net 4.5到全球600-650用户,直到我们有预算为我们所有的开发人员在新的visual studio上购买新的许可证。我们的目标是在。net 5.0之前保持这个状态,这样就不会再出现像这样愚蠢的。net问题了。