我目前正在处理一个Xamarin.Forms应用程序的问题。我创建的资源正在多个控件中使用,控件使用相同的对象呈现在屏幕上。我认为使用x:Shared="False"
属性(根据https://docs.microsoft.com/en-us/dotnet/framework/xaml-services/x-shared-attribute)可以解决这个问题。它没有:(任何想法如何在.xaml中创建相同的对象而不必定义多个资源?
<Grid.Resources>
<ResourceDictionary>
<SharedShapes:Circle x:Shared="False" x:Key="SpecCircle" Color="{StaticResource AccentColor}"/>
</ResourceDictionary>
</Grid.Resources>
<SharedControls:ImageButton Grid.Row="0" Grid.Column="0" Shape="{StaticResource SpecCircle}"...
<SharedControls:ImageButton Grid.Row="1" Grid.Column="0" Shape="{StaticResource SpecCircle}"...
.
.
.
非常感谢提前!
答案 0 :(得分:1)
您提到的链接主要讨论WPF框架 - 我认为Xamarin表单中不支持x:Shared
。
为避免必须多次声明形状 - 您可以使用DataTemplate
,并将其注册为StaticResource
。
并修改/扩展ImageButton
以添加类型为DataTemplate
的可绑定属性,该属性在设置时使用CreateContent()
方法将模板扩展为Shape
对象。
public DataTemplate ShapeTemplate
{
get { return (DataTemplate)GetValue(ShapeTemplateProperty); }
set { SetValue(ShapeTemplateProperty, value); }
}
public static readonly BindableProperty ShapeTemplateProperty = BindableProperty.Create(
nameof(ShapeTemplate),
typeof(DataTemplate),
typeof(ImageButton),
propertyChanged: (bObj, oldValue, newValue) =>
{
var view = bObj as ImageButton;
if (view != null && newValue != null)
view.Shape = (View)newValue.CreateContent();
}
);
<Grid.Resources>
<ResourceDictionary>
<DataTemplate x:Key="SpecCircleTemplate">
<SharedShapes:Circle Color="{StaticResource AccentColor}"/>
</DataTemplate>
</ResourceDictionary>
</Grid.Resources>
<SharedControls:ImageButton Grid.Row="0" Grid.Column="0"
ShapeTemplate="{StaticResource SpecCircleTemplate}"...
<SharedControls:ImageButton Grid.Row="1" Grid.Column="0"
ShapeTemplate="{StaticResource SpecCircleTemplate}"...
答案 1 :(得分:0)
Xamarin.Forms不支持。要获得新实例,您必须使用以下内容通过属性元素语法指定它:
<SharedControls:ImageButton Grid.Row="0" Grid.Column="0">
<SharedControls:ImageButton.Shape>
<SharedShapes:Circle x:Shared="False" x:Key="SpecCircle" Color="...."/>
</SharedControls:ImageButton.Shape>
</SharedControls:ImageButton>