Xamarin.Forms x:共享

时间:2017-11-17 17:14:29

标签: xamarin xamarin.forms

我目前正在处理一个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}"...
.
.
.

非常感谢提前!

2 个答案:

答案 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>