是否有办法从Xamarin.Forms中的XAML中分离样式?
本文关键字:XAML 分离 样式 中的 Forms Xamarin 是否 | 更新日期: 2023-09-27 18:10:24
我使用Xamarin。带有XAML页面的PCL中的表单。我想出的唯一方法是使用内联语法来样式化控件。
<Button Text="Inquiry" TextColor="Blue" />
我更喜欢用这样的结构:
<Page.Resources>
<Style TargetType="Button">
<Setter Property="BorderThickness" Value="5" />
<Setter Property="Foreground" Value="Blue" />
</Style>
</Page.Resources>
(http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh465381.aspx)
但是,Style元素(目前)不支持。有人成功地将布局与内容分开了吗?
供参考:我也在Xamarin论坛上发布了这个问题,所以任何通过谷歌来到这里的人可能也想看看这个页面:http://forums.xamarin.com/discussion/19287/styling-of-xamarin-xaml#latest
Style is not that hard[来源请求]。您可以实现自己的,就像我刚才为这个答案所做的那样。
下面是Xaml的样子:
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:YourNS;assembly=YourAssembly">
<ContentPage.Resources>
<ResourceDictionary>
<local:Style x:Key="buttonStyle">
<local:Setter Property="BorderWidth" Value="5"/>
</local:Style>
</ResourceDictionary>
</ContentPage.Resources>
<Button Text="Foo" local:Style.Style="{StaticResource buttonStyle}" x:Name="button"/>
</ContentPage>
的支持代码看起来像:
namespace YourNS
{
public class Setter {
public string Property { get; set; }
public string Value { get; set; }
}
[ContentProperty ("Children")]
public class Style
{
public Style ()
{
Children = new List<Setter> ();
}
public IList<Setter> Children { get; private set; }
public static readonly BindableProperty StyleProperty =
BindableProperty.CreateAttached<Style, Style> (bindable => GetStyle (bindable), default(Style),
propertyChanged: (bindable, oldvalue, newvalue)=>{
foreach (var setter in newvalue.Children) {
var pinfo = bindable.GetType().GetRuntimeProperty (setter.Property);
pinfo.SetMethod.Invoke (bindable,new [] {Convert.ChangeType (setter.Value, pinfo.PropertyType.GetTypeInfo())});
}
});
public static Style GetStyle (BindableObject bindable)
{
return (Style)bindable.GetValue (StyleProperty);
}
public static void SetStyle (BindableObject bindable, Style value)
{
bindable.SetValue (StyleProperty, value);
}
}
}
显然,执行赋值的代码非常简单,您可能需要根据您的需求(支持枚举等)对其进行调整,但它在这种简单的情况下工作。
我相信会有帮助的。
样式支持现在可用:
<ContentPage.Resources>
<ResourceDictionary>
<Style TargetType="Label">
<Setter Property="HorizontalOptions" Value="LayoutOptions.Center" />
<Setter Property="VerticalOptions" Value="LayoutOptions.Center" />
<Setter Property="FontSize" Value="48" />
<Setter Property="FontAttributes" Value="Bold, Italic" />
<Setter Property="Opacity" Value=".5" />
<Setter Property="TextColor" Value="Black" />
<Setter Property="Text" Value="Copied" />
<Setter Property="IsVisible" Value="False" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
来自Xamarin。表单1.3有更多的样式选择。
Xamarin的。1.3技术预览
- 支持XAML和代码中的样式
- 允许样式通过Style基于DynamicResources。BaseResourceKey
- 通过Device添加平台特定的样式。样式(支持iOS动态类型)
我能够创建更接近我在WPF/Silverlight中更习惯的ResourceDictionary的代码,并将其从实际页面(视图)中删除
-
而不是只有App.cs,我创建了一个新的xaml文件。App.xaml及其附带的App.xaml.cs后台代码。我将App.cs中的内容放入app . example .cs.
public partial class App : Application { public App() { var _mainView = new MainView(); var _navPage = new NavigationPage(_mainView); MainPage = _navPage; } //.. the methods below are currently empty on mine, //still figuring out some of the front end .. protected override void OnStart(){ } protected override void OnSleep(){ } protected override void OnResume(){ }
}
-
这允许我在App.xaml中声明我可以在其他视图上使用的应用程序资源:
<Style x:Key="buttonStyle" TargetType="{x:Type Button}"> <Setter Property="TextColor" Value="Blue"/> <!-- note: I tried Foreground and got errors, but once I used TextColor as the property, it ran fine and the text of the button I had changed color to what I expected --> <Setter Property="BackgroundColor" Value="White"/> <!-- note: I tried Background and got errors, but once I used BackgroundColor as the property, it ran fine and the background of the button I had changed color --> </Style> </ResourceDictionary>
然后我可以在我的页面上使用StaticResource
<Button Text="Inquiry" Style="{StaticResource buttonStyle}"/>
可能有几十种方法,甚至更好——但这有助于我将所有样式保存在一个位置(App.xaml)
注:我不知道为什么它不格式化代码背后的例子,我已经尝试了几次,但希望你仍然理解它
作为Silverlight开发者,我自己也在考虑Xamarin Forms的这个问题。
一种可选的方法是创建自己的控件(Xamarin术语中的"视图"),可以使用XAML或代码,并在构建界面时使用它们。