0

在网上搜索了几个小时后,我向大家求助:

我的 WPF 类库(.NET 3.5,COM 可见)中有一个表单,它使用一个 UserControl 和一个主题文件。

问题: 使用 WPF 应用程序时,按钮工作得很好,但在这个 .NET 3.5、COM Visible、类库中,它们根本不会显示。库中的其他对象可以使用和工作。可能是什么问题呢?我偏向于找不到的资源字典,或者一些找不到的资源,但我不能指手画脚。任何帮助都将受到欢迎!

一些代码

资源是通过设置

<Window.Resources>
   <ResourceDictionary>
       <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary  Source="pack://application:,,,/MyLibrary;component/Themes/Generic.xaml"/>
       </ResourceDictionary.MergedDictionaries>
   </ResourceDictionary>
</Window.Resources>

我们在这里放置 - 现在 - 一个简单的:

<Grid>
   <lib:ImageButton ImageSource="/MyLibrary;component/Images/some_image.png" />
</Grid>

不要忘记项目中库和 xamls 的参考:

xmlns:lib="clr-namespace:MyLibrary;assembly=MyLibrary"

MyLibrary 包含此 ImageButton - 一个简单的按钮扩展,主要用于保存图像。WPF 看起来有点像:

<UserControl x:Class="MyLibrary.ImageButton"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:lib="clr-namespace:MyLibrary"
         x:Name="me"
         Width="auto"
         Height="22"
         HorizontalAlignment="Center" VerticalAlignment="Center">

<UserControl.Resources>
    <ResourceDictionary>
        <Style TargetType="{x:Type library:ImageButton}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=me, Path=HasText}" Value="False">
                    <Setter Property="Width" Value="22" />
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=me, Path=HasText}" Value="True">
                    <Setter Property="Width" Value="auto" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ResourceDictionary>
</UserControl.Resources>

<Button x:Name="_button" Click="Button_Click" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Width="auto">
    <StackPanel Orientation="Horizontal">
        <Image Source="{Binding ElementName=me, Path=ImageSource}" Stretch="Uniform" />
        <TextBlock x:Name="_Text" Text="{Binding ElementName=me, Path=Text}" VerticalAlignment="Center" Margin="2, 0, 0, 0">
            <TextBlock.Resources>
                <Style TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=me, Path=HasText}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding ElementName=me, Path=HasText}" Value="True">
                            <Setter Property="Visibility" Value="Visible" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Resources>
        </TextBlock>
    </StackPanel>
</Button>
</UserControl>

我猜 .cs 方面相当随意。

最后,我们有 Generic.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/MyLibrary;component/Themes/MyTheme.xaml" />
    </ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

“MyTheme”拥有大量模板、颜色等。

4

2 回答 2

1

问题很可能源于这样一个事实,即您的类库项目不知道有您想要在任何地方使用的资源字典,即使您将资源字典合并到某个文件中也是如此。原因是 Visual Studio 和 Blend 都在寻找一个 ApplicationDefinition 文件供全局资源字典使用。

类库项目不能有 ApplicationDefinition 文件。但是,有一种方法可以共享资源,以便在设计时查看自定义控件项目。可以在此处找到有关该主题的问题和答案(免责声明:该链接当前指向我的答案)。

请注意,如果您使用上面链接的解决方案,您仍然必须在使用您的类库的任何应用程序项目的 App.xaml 级别引用您的资源字典,因为您的类库将不包含特定的样式。

于 2016-12-02T17:06:13.140 回答
1

好吧,这个问题已经很老了,但是这里有:

在做了很多比较之后,我验证了让它工作的方法是在你的类库中的程序集级别的某处设置以下行:

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, 
    ResourceDictionaryLocation.SourceAssembly 
)]
于 2018-12-09T16:11:42.117 回答