2014-09-25 82 views
3

我们使用自己风格的图像按钮。在我们的开发人员计算机上(所有Win 7 x64 VS 2013)都可以正常工作。也在用Win7 x64 .Net 4.5.x的客户计算机上。风格不适用于Win7 x32(.Net 4.0)

在Win 7 x32 .Net 4.0测试计算机上,图像按钮具有按钮的标准样式,而不是新样式。在Win 7 x 32和.Net 4.5上运行。所以我认为问题出在.Net版本而不是x32架构。

我们对图像按钮

<!-- Default Template --> 
<Style TargetType="{x:Type con:PreparedImageButton}" BasedOn="{x:Null}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type con:PreparedImageButton}"> 
       <Border 
        x:Name="_PART_BORDER" 
        CornerRadius="0" 
        BorderThickness="0" 
        Width="{TemplateBinding Width}" 
        Height="{TemplateBinding Height}" 
        Padding="{TemplateBinding Padding}" 

        Background="{DynamicResource DefaultBackground}"> 
        <Viewbox Stretch="Uniform"> 
         <ContentPresenter x:Name="_PART_SIGN" Content="{x:Null}" /> 
        </Viewbox> 
       </Border> 
       <ControlTemplate.Triggers> 
        <!-- Background Trigger --> 
        <!-- Disabled Background --> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter TargetName="_PART_BORDER" Property="Background" 
           Value="{DynamicResource DisabledBackground}" /> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="True"> 
         <Setter Property="Cursor" Value="Hand" /> 
        </Trigger> 
        <!-- Pushed Background --> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="_PART_BORDER" Property="Background" 
           Value="{DynamicResource PushedBackground}" /> 
        </Trigger> 

        <!-- Button Type Trigger --> 
        <!-- Next --> 
        <Trigger Property="ButtonType" Value="Next"> 
         <Setter TargetName="_PART_SIGN" Property="Content" Value="{DynamicResource NextSignCanvas}" /> 
        </Trigger> 
        <!-- Back --> 
        <Trigger Property="ButtonType" Value="Previous"> 
         <Setter TargetName="_PART_SIGN" Property="Content" Value="{DynamicResource BackSignCanvas}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

在我们使用DataTemplate中为我们的视图模型

<!-- Default ViewModel Template --> 
<DataTemplate DataType="{x:Type vm:PreparedImageButtonViewModel}"> 
    <con:PreparedImageButton ButtonType="{Binding ButtonType}" 
          IsVikingStyle="{Binding IsVikingStyle}" 
          Command="{Binding Command}" 
          IsEnabled="{Binding IsEnabled}" 
          Visibility="{Binding IsVisible, Converter={StaticResource BooleanVisibilityConverter}}" 
          IsCancel="{Binding IsCancel}" 
          IsDefault="{Binding IsDefault}" 
          ToolTip="{Binding ToolTip}" 
          Width="{DynamicResource DefaultButtonHeight}" 
          Padding="{DynamicResource DefaultSignPadding}" 
          Height="{DynamicResource DefaultButtonHeight}" /> 
</DataTemplate> 

并在窗口/用户控件我们在ContentControl中绑定此按钮大多数情况下,风格:

<ContentControl Content="{Binding ProtocolButton}" Margin="0,0,5,0" HorizontalAlignment="Right" /> 

任何想法.Net 4.0出了什么问题?

Win7的32倍.NET 4.0 Windows 7 x32 .Net 4.0 X64 Win7的.NET 4.5 Windows 7 x64 .Net 4.5.1

编辑

看来,.NET 4.0是不能正确地解决合并后的字典。通常我们在当前项目的Global.xaml中合并外部字典。

如果我们用图像按钮做到这一点,它不起作用。如果我们在Windows/UserControl中将图像按钮的字典直接合并到我们使用它们的位置,则可以使用它(在.Net 4.0下)。

对于我们所有的其他控件,合并工作没有问题。

现在我们测试一下,如果问题出在那里,如果我们只用.Net 4.0和VS2010在电脑上构建解决方案。

+0

我将调查第一件事是WPF组件一样PresentationFramework&PresentationCore的版本。我之前通过运行应用程序然后使用ProcessExplorer创建转储完成了此操作,生成的转储可以在Visual Studio中打开,并且它应该为您提供加载的程序集列表以及重要的所有程序集完整版本。 – AwkwardCoder 2014-09-25 09:41:18

+0

如果它们不同,通常意味着机器被修补到不同的日期,我们有类似的问题,因为一些系统缺少某些MS修补程序。 – AwkwardCoder 2014-09-25 09:44:05

+0

似乎.Net 4.0(应用程序构建VS2013设置在.Net 4.0上)无法正确解析合并字典(请参阅我的编辑)。 – WebDucer 2014-09-25 10:07:26

回答

0

对我来说,解决方案如下:

删除所有的资源字典的从App.xaml中 并将它们添加程序:对的App.xaml.cs

构造

 var item = new ResourceDictionary 
      { 
       Source = new Uri("link to a skin for example") 
      }; 
     Current.Resources.MergedDictionaries.Add(item); 

     _appboot = new Bootstrapper(); 
     var bootRd = new ResourceDictionary {{"bootstrapper", _appboot}}; 
     Current.Resources.MergedDictionaries.Add(bootRd); 

这应该解决这个问题。

有关该问题的信息可以在这里找到: https://msdn.microsoft.com/en-us/library/ee941656(VS.100).aspx#windows_presentation_foundation_wpf

+0

这对我们不起作用。我们使用WinForms作为应用程序,并在主机元素中使用WPF。 – WebDucer 2015-03-02 12:01:25