Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在其他程序集中加载控件时,文本框的样式会导致异常_C#_Wpf_Resourcedictionary_Mergeddictionaries - Fatal编程技术网

C# 在其他程序集中加载控件时,文本框的样式会导致异常

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

我已经为可重用控件创建了一个程序集(除其他外)。在此程序集中,有一个用于自定义控件样式的Themes/Generic.xaml文件。 我想在不同的文件中为不同的控件实现不同的样式,所以我认为使用合并字典是个好主意

我的Generic/Themes.xaml如下所示:

<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>