WPF 在资源文件中使用自定义控件报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 在资源文件中使用自定义控件报错相关的知识,希望对你有一定的参考价值。

自定义了一个AQPath类,继承自Shape类。但是在资源文件中使用会报错ResourceDictionary

参考技术A 我做了个demo 在一个StackPanel 里放了n个button做实验。你参考下吧。 在Window.Resources里加 <Storyboard x:Key="Storyboard1"> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="btn"> <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/> </DoubleAnimationUsingKeyFrames> </Storyboard> 在Window.Triggers里加 <EventTrigger RoutedEvent="FrameworkElement.Loaded"> <BeginStoryboard Storyboard="StaticResource Storyboard1"/> </EventTrigger> XAML代码: <StackPanel Orientation="Horizontal"> <Button Width="50" Height="50"/> <Button Width="50" Height="50"/> <Button x:Name="btn" Width="50" Height="50"/> <Button Width="50" Height="50"/> <Button Width="50" Height="50"/> </StackPanel>追问

这个问题是自定义控件报错,跟Button有多少个有什么关系

WPF中的Pack URI

说来也简单:首先,我在WPF项目中建立了一个用户自定义控件(CustomControl),VS模板为我们自动生成了

CustomControl1和Theme文件夹(里边包含一个Generic.xaml):

接着,我想把它移动到一个新的类库(DLL)里去:

然后我添加了对类库的引用在WPF项目中,我开始尝试使用该自定义控件,结果,发现显示的结果始终不对,但是也

没有报错。究其原因,肯定是xaml没有加载到,致使界面没有渲染模板。最后开始搜索MSDN,发现WPF应用程序外

部包引用一般使用pack://规范。

PACK URI

   表 1:标记中的绝对 Pack URI

 

文件

绝对 pack URI

资源文件 — 本地程序集

"pack://application:,,,/ResourceFile.xaml"

子文件夹中的资源文件 — 本地程序集

"pack://application:,,,/Subfolder/ResourceFile.xaml"

资源文件 — 所引用的程序集

"pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml"

所引用的程序集的子文件夹中的资源文件

"pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"

所引用的版本化程序集中的资源文件

"pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml"

内容文件

"pack://application:,,,/ContentFile.xaml"

子文件夹中的内容文件

"pack://application:,,,/Subfolder/ContentFile.xaml"

源站点文件

"pack://siteoforigin:,,,/SOOFile.xaml"

子文件夹中的源站点文件

"pack://siteoforigin:,,,/Subfolder/SOOFile.xaml"

 

    表 2:标记中的相对 Pack URI

 

文件

相对 pack URI

本地程序集中的资源文件

"/ResourceFile.xaml"

本地程序集的子文件夹中的资源文件

"/Subfolder/ResourceFile.xaml"

所引用的程序集中的资源文件

"/ReferencedAssembly;component/ResourceFile.xaml"

所引用的程序集的子文件夹中的资源文件

"/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"

内容文件

"/ContentFile.xaml"

子文件夹中的内容文件

"/Subfolder/ContentFile.xaml"

在代码中使用 Pack URI

在代码中,可以通过实例化 Uri 类并将 pack URI 作为参数传递给构造函数来指定 pack URI。 下面的示例说明了这一点。

Uri uri = new Uri("pack://application:,,,/File.xaml");

 

默认情况下,Uri 类将 pack URI 视为绝对 pack URI。 因此,在使用相对 pack URI 创建 Uri 类的实例时会引发异常。

Uri uri = new Uri("/File.xaml");

 

幸运的是,Uri 类构造函数的 Uri(String, UriKind) 重载可以接受一个类型为 UriKind 的参数,使您可以指定 pack URI 是绝对

URI 还是相对 URI。

// Absolute URI (default)
Uri absoluteUri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute);
// Relative URI
Uri relativeUri = new Uri("/File.xaml", UriKind.Relative);

 

当您能够确定所提供的 pack URI 是相对 pack URI 还是绝对 pack URI 的时候,应该只指定 Absolute 或 Relative。 如果您不了解

所使用的 pack URI 的类型(例如,当用户在运行时输入 pack URI 时),请改用RelativeOrAbsolute

// Relative or Absolute URI provided by user via a text box
TextBox userProvidedUriTextBox = new TextBox();
Uri uri = new Uri(userProvidedUriTextBox.Text, UriKind.RelativeOrAbsolute);

 



SO,外部资源文件,比如视频、图片等,路径的引用都需要使用pack uri。
另外,还有,为什么在普通类库中右键添加新建项,没有wpf 自定义控件选项,只能手动建,或者从WPF项目建立后移植过来。

以上是关于WPF 在资源文件中使用自定义控件报错的主要内容,如果未能解决你的问题,请参考以下文章

wpf 重新加载自定义控件出现异常

WPF 在控件中添加自定义属性

WPF 杂谈——自定义控件

WPF使用Winform自定义控件

WinForm中调用WPF控件

我在wpf中使用了自定义的控件,请问如何为自定义控件中的一个按钮设置快捷键?