C# 在其他程序集中加载控件时,文本框的样式会导致异常
我已经为可重用控件创建了一个程序集(除其他外)。在此程序集中,有一个用于自定义控件样式的Themes/Generic.xaml文件。 我想在不同的文件中为不同的控件实现不同的样式,所以我认为使用合并字典是个好主意 我的Generic/Themes.xaml如下所示:C# 在其他程序集中加载控件时,文本框的样式会导致异常,c#,wpf,resourcedictionary,mergeddictionaries,C#,Wpf,Resourcedictionary,Mergeddictionaries,我已经为可重用控件创建了一个程序集(除其他外)。在此程序集中,有一个用于自定义控件样式的Themes/Generic.xaml文件。 我想在不同的文件中为不同的控件实现不同的样式,所以我认为使用合并字典是个好主意 我的Generic/Themes.xaml如下所示: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://sch
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Resources/MyTextBoxStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:general="clr-namespace:com.testsoft.General">
<Style TargetType="{x:Type general:MyTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="IsReadOnly" Value="True" />
<Setter Property="Foreground" Value="Black" />
<Style.Triggers>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Foreground" Value="Gray" />
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
在其他程序集中使用此自定义文本框时,应用程序崩溃,出现以下异常:
IOException:Die Ressource“resources/mytextboxstyle.xaml”kann nicht gefunden werden.
(找不到资源)
但是,如果我不使用MergedDictionary方法并将所有样式XAML直接添加到Generic/Themes.XAML文件中,那么一切都可以正常工作
我试图将MyTextBoxStyle.xaml文件的构建操作更改为Resource,Embedded Resource,但没有帮助。
我如何使用MergedDictionaries,并且仍然能够在其他程序集中使用styled控件?这在您的新程序集中吗
xmlns:general=“clr命名空间:com.testsoft.general”
如果该名称空间不存在,则可能将其从xaml中删除
此外,如果它是一个资源,您可能必须通过类似
我记不起精确的方法,所以上面是一个大规模的概括
另外,您是否将WPFLibrary作为资源包含在testbase项目中?因为如果没有,那就是您的问题所在,它没有将mytextbox作为dll包含在wpf项目中,因此无法从项目中加载资源。使用程序集标识的资源的绝对路径(用自定义控件库的程序集名称替换
WpfCustomControlLibrary1
)
我做的事情和你想做的完全一样。创建一个
FrameworkLibrary
,并在每个客户解决方案上使用它。如果我定义了DefaultStyleKey
,我将使用未注释的过程。我不知道在静态构造函数上是否有更好的性能。在CustomerApplication(Testbase)
中,您只需在App.xaml
中链接主题.xaml
控制库(WpfControlLibrary1)
使用System.Windows;
使用System.Windows.Controls;
命名空间WpfControlLibrary1
{
公共类MyTextBox:TextBox
{
静态MyTextBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyTextBox)),new FrameworkPropertyMetadata(typeof(MyTextBox));
}
//公共MyTextBox()
//{
//DefaultStyleKey=typeof(MyTextBox);
//}
}
}
测试应用程序(Testbase)
App.xaml
我通过将url调整为以下内容解决了此问题:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ControlFramework.Wpf;component/Resources/MyPathTextBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
现在一切都按预期工作(正在应用样式,并且没有引发异常)。这会导致相同的异常。您确实使用了它吗?因为它不是应该使用的代码的精确描述。请在这里检查答案的添加,我认为这可能是接下来需要检查的内容。为什么首先要在代码中应用样式?这是针对MVVM的…否则该样式将不会被应用。MVVM是如何做到这一点的?这取决于你想做什么。。。如果您将在代码中创建的文本框添加到视图中,那么您已经有点违反规则了。通常,您会使用items控件并将其源绑定到可观察的集合,并告诉它如何显示给定的数据。如果你能在更大的范围内向我解释你在做什么,也许我能帮上忙。我已经创建了一个自定义文本框。文本框用于另一个项目(它将与XAML一起添加)。文本框提供了一个新属性。我的模型类绑定到这个属性,所以我很确定我没有违反这里的MVVM模式?MVVM意味着,除了将执行的代码与显示的视图分开之外,您还需要在代码中更改视图的设计/行为。除非我在这里遗漏了一些不完全使用该模式的东西……它在一个示例项目中对我有效。看起来你有一些非标准的东西。确保TextBoxStyle.xaml位于正确的位置并标记为页面谢谢您的回答。我已经完成了完全相同的步骤,没有任何编译错误(或“卷曲”行),所以一切都找到了。当我启动应用程序时,它仍然崩溃…相同的异常。即使我添加MyTextBoxStyle.xaml而不是Themes/Generic.xaml。我与Reflector进行了双重检查,文件位于程序集的Resources文件夹中。哦,好的,出于好奇,您的库使用了什么命名空间?
<ResourceDictionary Source="pack://application:,,,/WpfCustomControlLibrary1;component/Resources/MyTextBoxStyle.xaml" />
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ControlFramework.Wpf;component/Resources/MyPathTextBox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>