2012-07-02 57 views
0

我喜欢的方式,Windows Phone的项目加载默认的资源,如这些的:默认情况下,WindowsPhone项目是如何加载资源的?

<phone:PhoneApplicationPage 
x:Class="PhoneApp4.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
FontFamily="{StaticResource PhoneFontFamilyNormal}" 
FontSize="{StaticResource PhoneFontSizeNormal}" 
Foreground="{StaticResource PhoneForegroundBrush}" 
SupportedOrientations="Portrait" Orientation="Portrait" 
shell:SystemTray.IsVisible="True"> 
    ... 

PhoneFontFamilyNormal,PhoneFontSizeNormal,PhoneForegroundBrush。因为我为WPF创建了许多库,并且它们都包含一个公共库,并且我在加载该库时正在考虑加载默认情况下的样式资源。

我该如何实现这种方式?

顺便说一下,我正在与WPF合作。

回答

1

嗯,没人接,我会尽力帮助你..

您可以在App.xaml中定义资源的所有应用程序使用(我想你已经知道这件事),样品:

xmlns:win="clr-namespace:System;assembly=mscorlib" 

<Application.Resources> 
    <ResourceDictionary> 
     <win:Double x:Key="MyBigFontStyle">186.667</win:Double> 
     <!-- .... --> 

和..网页在我的应用:

<phone:PhoneApplicationPage x:Class="Project.Page" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
     xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
     FontFamily="{StaticResource PhoneFontFamilyNormal}" 
     FontSize="{StaticResource MyBigFontStyle}" 
<!-- .... --> 

而且所有的文本都是巨人,因为依赖项属性发生了变化。 现在从技术角度来说..

微软世界上有依赖属性,其值始终从父组件继承。 示例:(DataContext,FontFamily,FontSize等) 只有当它们不明确时(除了其他例外情况,是否没有人在修改,与它们进行交互)才会发生这种情况。

虽然我从来没有寻求如何创建其中之一或它们如何工作的方面。 您可以覆盖默认值以扩展到应用程序的所有组件。 对于Windows手机,我用了以下功能:

public App() 
    { 
     // Global handler for uncaught exceptions. 
     UnhandledException += Application_UnhandledException; 

     // Standard Silverlight initialization 
     InitializeComponent(); 

     // Phone-specific initialization 
     InitializePhoneApplication(); 

     var myNewBrush = new SolidColorBrush(new Color { B = 255, A = 255, R = 88, G = 255 }); 
     this.Resources.Remove("PhoneAccentBrush"); 
     this.Resources.Add("PhoneAccentBrush", myNewBrush); 

     // Other code that might be here already... 
    } 

这可以用任何标准的资源来完成。 这样做是因为没有DynamicResources作为WPF

注意:StaticResource如果在运行应用程序过程中更改它,则不会传播您的更改。

对不起英语不太好,不知道这是不是你想知道的,但我已经帮了一些忙。

0

您必须在库本身内部添加资源。

例子:

如果你有一个叫做MyControl自定义控件,您可以定义资源,如下图所示。

public class MyControl 
{ 
    public MyControl() 
    { 

     var myBrush = new SolidColorBrush(Colors.Red); 
     this.Resources.Add("MyBrush", myBrush); 
    } 
} 

然后,一旦你在一个WPF项目添加引用到你的DLL,你会得到可用的资源,通过你的控制。

例子:

<my:MyControl Foreground="MyBrush"> 
+0

您的解决方案将无法工作。在Foreground中设置=“{StaticResource MyBrush}”。另一个问题是,在设计时,组件不会看到。理想的是在xaml代码中定义资源。 –