我试图在我的资源字典中获取特定模板.这是我的资源字典
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:view="clr-namespace:Test.Layout.View"
xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><DataTemplate x:Key="LeftRightLayout">
<toolkit:DockPanel>
<view:SharedContainerView toolkit:DockPanel.Dock="Left"/>
<view:SingleContainerView toolkit:DockPanel.Dock="Right"/>
</toolkit:DockPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
但是当它到达XamlReader.Load时
private static ResourceDictionary GetResource(string resourceName)
{
ResourceDictionary resource = null;
XDocument xDoc = XDocument.Load(resourceName);
resource = (ResourceDictionary)XamlReader.Load(xDoc.ToString(SaveOptions.None));
return resource;
}
Run Code Online (Sandbox Code Playgroud)
找不到"SharedContainerView"类型,因为"clr-namespace:Test.Layout.View"是一个未知的命名空间.[线:4位置:56]
xaml datatemplate resourcedictionary xamlreader silverlight-4.0
我有一个 WPF 控件,我想在我的 WinForms 应用程序(使用 ElementHost)的多个位置(=> 此控件的多个实例)中使用它。
此外,我希望我的 UserControl 的所有实例共享一个 ResourceDictionary 的单个实例。
在 WPF 应用程序中,我将通过在应用程序资源中合并我的 ResourceDictionary 来实现这一点。
但是,我不想在我的 WinForms 应用程序中创建 WPF 应用程序实例。相反,我正在寻找另一种方式。
我找到了一个解决方案,但我希望您知道一种不需要任何代码的更好方法:
public static class StaticRDProvider
{
static ResourceDictionary rd;
static StaticRDProvider()
{
var uri = new Uri("WpfControls;Component/GlobalResourceDictionary.xaml", UriKind.Relative);
rd = (ResourceDictionary) Application.LoadComponent(uri);
}
public static ResourceDictionary GetDictionary
{
get { return rd; }
}
}
Run Code Online (Sandbox Code Playgroud)
用户控件.xaml.cs:
public partial class MyCustomUserControl : UserControl
{
public MyCustomUserControl()
{
Resources.MergedDictionaries.Add(StaticRDProvider.GetDictionary);
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
那个有效。但我更喜欢只适用于 XAML 的解决方案。另外我希望能够使用静态资源。因此,在控件初始化后将静态 ResourceDictionary 添加到 Controls MergedDictionaries 不是一个选项。 …
尝试从具有相同名称但位于不同文件夹的两个单独程序集中加载资源时遇到了一些问题:
甲ResourceDictionary命名Resources.xaml在每个这些组件的嵌入式(作为页).
要加载第一个ResourceDictionary,我使用以下代码段:
// Load the assembly in memory
var assembly = Assembly.LoadFrom(@"c:\folder1\FCL.Dll");
// Get Dictionnary
var uri = string.Format("pack://application:,,,/{0};Component/Resources.xaml", assembly.GetName().Name);
var resourceDictionary = new ResourceDictionary { Source = new Uri(uri) };
Run Code Online (Sandbox Code Playgroud)
这个正在运行!
但是,当我尝试加载第二个ResourceDictionary与代码(只是改变了相同的片段Assembly.LoadFrom(@"c:\folder1\FCL.Dll")通过Assembly.LoadFrom(@"c:\folder2\FCL.Dll"),它不会从C加载资源:\文件夹2\fcl.dll,但那些存储在先前加载C:\文件夹1\fcl.dll: - (
原因:URI 的shortAssemblyName字段是相同的,在可能的情况下FCL:
var uri = string.Format("pack://application:,,,/{0};Component/Resources.xaml", assembly.GetName().Name)
Run Code Online (Sandbox Code Playgroud)
有人知道如何解决这个问题吗?
这是场景:
我一直在使用 VS 2010 使用 MEF 编写相当大的 WPF 项目。这个解决方案中有多个项目,我有一个ResourceDictionary适合我的所有风格。
在AppStyles.xaml ResourceDictionary位于我的启动项目,它包含了所有的我的风格的项目。在我的内部,我App.xaml有以下内容:
<Application x:Class="Dionysus.Shell.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DispatcherUnhandledException="UnhandledException" ShutdownMode="OnMainWindowClose">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="AppStyles.xaml"/>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
现在,这一切都在 VS 2010 的设计模式下完美运行,当我调试时,正确的样式将应用于我的所有控件。但是最近换了VS 2012,设计器已经不工作了!当我调试它时,它可以完美运行,但是每当我使用我的一种样式时,如下所示:
<Button Name="btnForward" Height="23" Margin="10,0" Style="{StaticResource DionysusButton}" Grid.Row="2" Grid.Column="0"/>
Run Code Online (Sandbox Code Playgroud)
我在 VS 2012 设计器中收到以下错误:
The resource "DionysusButton" could not be resolved.
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会发生这种情况,我已经重命名了我的Style,甚至ResourceDictionary都无济于事。
我应该在 VS 2012 中以不同的方式执行此操作,还是 VS 2012 存在问题?
我发现很多帖子都说将x:Namemy的属性更改AppStyles.xaml ResourceDictionary为x:Key将解决此问题,但我不能这样做,因为它不是ResourceDictionary.
提前谢谢
- 更新
我正在使用 …
我正在开发一个 WPF 控件,但我无法控制将使用它的应用程序。某些 XAML 资源字典键对于我的控件来说显然是唯一的,例如<Style TargetType="{x:Type MyControl}">,因此不存在冲突的风险。
但是,我也需要使用非唯一对象BooleanToVisibilityConverter。如果我使用"BooleanToVisibilityConverter"键添加它,那么包含我的资源字典的控件的使用者可能(并且很可能)已经在他们的代码中定义了一个类似的转换器,可能具有不同的行为。
标准控制以某种方式避免冲突。有一个<BooleanToVisibilityConverter x:Key="bool2VisibilityConverter" />在Aero.NormalColor.xaml这是不是WPF应用程序可见。但是,我不知道如何实现这一目标。
如何避免资源名称冲突?如何为我的控件设置“本地”资源名称?
我正在创建一个包含 WPF 用户控件的类库项目。我的要求是所有控件都具有相同的样式。我的项目看起来像:

为了解决这个问题,我所做的事情:
在AssemblyInfo.cs 中,我添加了:
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
将ResourceDictionary1.xaml添加到添加样式的项目中。
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="Brush1" Color="#FF19199E"/>
</ResourceDictionary>
现在,如果我想在UserControl1.xaml上使用样式,我会这样做:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ResourceDictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid >
<Rectangle Fill="{StaticResource Brush1}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
我知道它很好用,但这里有一个问题。每次我创建一个新的 userControl 时,我都必须合并字典。在常规 WPF 应用程序中,我只需在 App.xaml 上合并字典一次,就可以在整个应用程序中使用该字典。如何避免每次创建新用户控件时都必须合并字典?如果我打算添加一个新的资源字典,我将不得不转到所有 userControls 并合并另一个字典。也许我写错了问题标题,我的问题应该是如何将 App.xaml 文件添加到类库项目
我在许多转换器中使用资源字典(相同的字典)作为局部变量.
var DeignerDictionary = new ResourceDictionary
{
Source = new Uri(path)
};
Run Code Online (Sandbox Code Playgroud)
每次我创建一个新实例并且应用程序中的内存非常高.
然后我将资源字典移动到一个静态字段,我正在重用字典,但样式没有正确呈现.
public class resourceDictionaryProvider{
public readonly ResourceDictionary StaticDictionary =
new ResourceDictionar {Source = new Uri(path)};
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议我做错了,请提供您的建议.
将ResourceDictionary更改为仅静态后出现此问题.但以下代码工作正常.
public class resourceDictionaryProvider{
public static readonly ResourceDictionary StaticDictionary =
new ResourceDictionar {Source = new Uri(path)};
}
Run Code Online (Sandbox Code Playgroud)
现在我正在为resourceDictionaryProvider类创建一个实例,它工作正常,但我不想创建实例所以只有我已经将它更改为静态.
这里的static关键字有什么问题?
我想在 app.xaml 上设置我的资源,然后在应用程序的不同视图中使用它,但是当我设置颜色时应用程序崩溃 uu,有人可以帮助我吗?
应用程序.xaml
<Application.Resources>
<ResourceDictionary>
<Color x:Key="Primary">#FFC107</Color>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
在 StackLayout 中使用它
<StackLayout Orientation="Vertical" BackgroundColor="{StaticResource Primary}">
Run Code Online (Sandbox Code Playgroud) 我们是否可以UserControl在使用时向 a 添加新资源,而不清除UserControl已定义自身的资源?
因此,例如,这是一个UserControl:
<UserControl x:Class="MyControl">
<UserControl.Resources>
<!--Resource1-->
<!--Resource2-->
</UserControl.Resources>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
我在以下位置使用此控件MainWindow:
<MainWindow>
<local:MyControl>
<local:MyControl.Resources>
<!--Resource3-->
</local:MyControl.Resources>
</local:MyControl>
</MainWindow>
Run Code Online (Sandbox Code Playgroud)
这样做会清除 Resource1 和 Resource2,我只剩下 Resource3。我也试过<ResourceDictionary.MergedDictionaries>,也有同样的效果。我正在寻找一种将 Resource3添加到现有资源列表的方法。
我尝试通过在将控件添加到 UI 的同时将样式资源合并到应用程序资源来为我的自定义控件应用新样式,但新样式并未首次应用于控件。
样品控制
CustomTextBoxExt.cs
public class CustomTextBoxExt : TextBox
{
static CustomTextBoxExt()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTextBoxExt), new FrameworkPropertyMetadata(typeof(CustomTextBoxExt)));
}
}
Run Code Online (Sandbox Code Playgroud)
默认样式 Generic.xaml
<Style x:Key="TextBoxExtStyle" TargetType="{x:Type local:CustomTextBoxExt}">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
<Setter Property="BorderBrush" Value="Red" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="KeyboardNavigation.TabNavigation" Value="None" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="AllowDrop" Value="True" />
<Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst" />
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomTextBoxExt}">
<Border
x:Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding …Run Code Online (Sandbox Code Playgroud) wpf ×8
xaml ×5
c# ×2
wpf-controls ×2
.net ×1
colors ×1
conflict ×1
datatemplate ×1
optimization ×1
resources ×1
runtime ×1
static ×1
styles ×1
uri ×1
xamlreader ×1