首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WPF控件库中是否有使用StaticResource并能够在设计时查看的方法?

在WPF控件库中是否有使用StaticResource并能够在设计时查看的方法?
EN

Stack Overflow用户
提问于 2012-04-06 04:26:24
回答 3查看 14.2K关注 0票数 24

我有一个WPF控件库,它正在添加到windows窗体应用程序中。我们希望允许控件是可本地化的,但是我不确定如何在不重复代码的情况下完全完成这一任务。这就是我现在要做的

基本上,在windows应用程序中,在主应用程序启动之前,我正在实例化一个驻留在窗体应用程序中的App.xaml (包含我指向表单应用程序中的资源的链接)。这对于运行时来说是完美的。

但是,我的用户控件都有Content="{StaticResource SomeVariableName}",结果是空的。我可以通过在我的控制库中拥有一个与我的windows窗体应用程序中的app.xaml和适当的资源字典相匹配的方法来解决这个问题。但是,这是重复的代码。

我已经尝试过的东西都没有用:

  • 从我的窗体应用程序中实例化位于用户控件库中的App.xaml。这不起作用,因为URI对我的资源是在寻找嵌入式资源,而不是本地资源字典(然后,我可以简单地将资源文件从控件复制到构建上的窗体应用程序中的适当位置)。我能在这里利用DeferrableContent吗?不过,就我所能找到的这个属性和应该如何使用它而言,网上并没有太多内容。
  • 我想为应用程序和字典使用post构建,但是,据我所知,应用实例化是对编译的App.xaml的静态引用。因此,App.xaml必须存在于表单(至少 )中。
    • 我确实尝试过使用一个带有post构建的复制App.xaml来移动resourcedictionary.xaml。我认为复制的app.xaml是可以的,因为这是驱动力,而且您可能不想依赖控件中的一个(哪一个回转,让您怀疑是否应该在控件中使用App.xaml?)除非您希望允许使用嵌入式资源的默认设置.)这也失败了,说它找不到资源,即使它被放置在URI应该指向的位置。反编译代码指向Uri resourceLocater = new Uri("/WindowsFormsApplication3;component/app.xaml", UriKind.Relative);

那么,是否有任何方法允许此操作,并使设计时查看组件的默认值并避免重复?或者,在这种情况下,复制可以吗?如果我的第二个项目的子项目看起来还好(复制的App.xaml与构建复制的资源),我如何使它不寻找组件级的项目,而是一个文件级别的项目?

最后一个问题(如果需要的话,我可以单独发布),我刚刚注意到了。我的App.xaml是内置在代码中的,所以这不允许我动态地创建新的ResourceDictionaries。有办法这样做吗?

Final option...possibly是最好的吗?- 无论如何,我计划使用Andre van Heerwaarde的代码,那么我应该检查文件的存在并将其作为合并的资源动态添加吗?基本上,在我的用户控件中有一个链接到默认嵌入式App.xaml的ResourceDictionary。然后,让代码动态查找适当的本地化资源,这些资源可以是相对的文件路径吗?我在这里看到的唯一缺点是,在fly...which上不能更改默认设置,我甚至可以在指定的位置(使用某种约定)更改默认值,而不是使用内置的?

哦,我不想要嵌入式资源的原因是为了让最终用户能够在部署构建后添加/修改新的本地化资源。

我可以添加代码,如果它能帮助您更好地可视化这一点,请告诉我。

更新

我现在遇到了一个进一步的问题,造型,而不仅仅是本地化。

下面是其中一个控件上的一个内部按钮的示例:

代码语言:javascript
复制
<Button Style="{StaticResource GrayButton}"

还有一些我试过/想过的:

  • 由于库项目中不允许使用app.xaml,所以我无法在设置了ResourceDictionary的情况下创建一个ApplicationDefinitions (这永远不会被使用)。我可以将它嵌入到控件的资源中,但是这样做总是优先于任何应用程序级别的资源,并且我失去了自定义性。

这里有一个连接案例听起来像我正在寻找的东西,但是它并没有提供任何真正的解决方案。

我能想到的解决方案(除了top..which之外不起作用)可能会起作用(而且还没有尝试),对于我认为应该很简单的事情来说,似乎也有很多工作要做。但是,我可能能够在可以绑定到的控件中创建一些依赖属性,然后允许那些属性被将使用该控件的项目覆盖。正如我所说,对于一个非常简单的请求来说,这似乎是一项很大的工作:)。这样能行吗?更重要的是,是否有更好、更简单的解决方案?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-26 13:16:57

我曾经遇到过这个问题,我解决了这个问题,我删除了整个“参考资料是按规范字典中的键索引的对象”的内容。

我的意思是,简单的事实是,在一个项目中定义一个资源,并在另一个项目中引用它的“关键”,应该会让任何理智的人感到不安。我想要强大的引用。

解决此问题的解决方案是创建一个定制工具,将资源xaml文件转换为具有每个资源属性的静态类:

所以MyResources.xaml:

代码语言:javascript
复制
<ResourceDictionary>
  <SolidColorBrush x:Key="LightBrush" ... />
  <SolidColorBrush x:Key="DarkBrush" ... />
</ResourceDictionary>

变成MyResources.xaml.cs

代码语言:javascript
复制
public static class MyResources {

  static MyResources() {
    // load the xaml file and assign values to static properties
  }

  public static SolidColorBrush LightBrush { get; set; }
  public static SolidColorBrush DarkBrush { get; set; }

}

对于引用资源,可以使用x:Static而不是StaticResource

代码语言:javascript
复制
<Border 
   Fill="{x:Static MyResources.LightBrush}"
   BorderBrush="{x:Static MyResources.DarkBrush}"
   ... />

现在您获得了强大的引用、自动完成和资源编译时间检查。

票数 16
EN

Stack Overflow用户

发布于 2012-04-20 15:58:59

我也遇到了处理样式主题和可用静态资源的问题。所以,我创建了一个独立的库,基本上除了要使用的主题之外,什么都没有,就像您以前链接问题的合并资源一样。

然后,在Windows (.xaml)中,我只是引用了那个库,类似于

代码语言:javascript
复制
<Window x:Class="MyAppNamespace.MyView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ... />

  <Window.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <!-- Common base theme -->
        <ResourceDictionary   Source="pack://application:,,,/MyLibrary;component/Themes/MyMainThemeWrapper.xaml" />
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
  </Window.Resources>

  <Rest of XAML for the WPF window>

</Window>

“组件”似乎是指给定的"MyLibrary“项目的根。在实际项目中,我创建了一个名为“主题”的子文件夹,因此源代码包括.;构成部分/主题/.

"MyMainThemeWrapper.xaml“非常类似于嵌套的合并资源字典,它从其他库中完美地看到了一切。

票数 0
EN

Stack Overflow用户

发布于 2012-04-25 20:11:49

这是我对你问题的部分解决办法。我没有尝试处理松散的资源,但我在WinForms和WPF之间共享资源方面取得了一些成功。

  • 创建一个类库,将资源包含在.ResX文件中(例如,Resources.resx、Resources.fr.resx等)
  • 在WPF用户控件库中创建WPF控件。
  • 创建您的WinForms主机
  • 使用Infralution.Localization.Wpf标记扩展和区域性管理器从WPF引用资源库中的资源。
  • 将WPF用户控件的内容作为控件模板放入一个或多个资源字典中,例如,g。
  • 在用户控件中使用资源模板
  • 添加几行代码以使事情正常工作 公共部分类UserControl1 : UserControl { //我们需要对资源库的引用,以确保它被加载到内存私有Class1 _class1 =新Class1();public UserControl1() { //使用CultureManager切换到当前区域性CultureManager.UICulture = Thread.CurrentThread.CurrentCulture;InitializeComponent();}}

这里有一个简单的演示应用程序,名为WindowsFormsHost.7z

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10039102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档