如何使用x:Object和何时?

时间:2017-10-20 08:43:49

标签: c# xaml xamarin xamarin.forms

当将标记扩展名x:Arguments的参数传递给docs指定的非默认构造函数时,我可以看到使用具体数据类型,例如x:Int32或{{1} },但是x:String的用例是什么?更重要的是,使用它,标签之间应该放什么? x:Object

在整数或字符串的情况下,很自然地将它们视为变量赋值,然后将变量传递给构造函数。但是在<x:Object> ??? </x:Object>的情况下,这样的变量通常由另一个用户定义的类构造,那么如何指定要创建的类?

3 个答案:

答案 0 :(得分:3)

x:Object

The x:Object primitive corresponds to Object. This primitive is not typically used in application markup but might be useful for some scenarios such as checking assignability in a XAML type system. You can use as Argument.

Take a look at the Xamarin documentation on Resource Dictionaries for a full explanation on how to use the x:Key attribute of your resources.

Each resource has a key that is specified using the x:Key attribute, which gives it a descriptive key in the ResourceDictionary.

You can use it like below:

<local:MockFactory >
     <x:Arguments>
         <x:Array Type="{x:Type x:Object}">
             <x:String>Foo</x:String>
             <x:String>Bar</x:String>
         </x:Array>
     </x:Arguments>
</local:MockFactory>

you can find a related example here

答案 1 :(得分:2)

从技术上讲,您可以将x:Object作为构造函数参数传递。 x:Object对应于具有默认构造函数的System.Object。所以,如果你有

 public class MyClass {
     public MyClass(object arg) {

     }
 }

您可以像这样构建它:

<my:MyClass>
  <x:Arguments>
    <x:Object />
  </x:Arguments>
</my:MyClass>

但这不太有用,因为它将对应

new MyClass(new object());

由于Object没有任何其他构造函数 - 您无法以任何其他有意义的方式构造它。因此,当构造函数需要对象类型的参数时 - 您不想使用x:Object而是使用实际类型:

<my:MyClass>
  <x:Arguments>
    <x:String>string</x:String>
  </x:Arguments>
</my:MyClass>

对应

new MyClass("string");

答案 2 :(得分:1)

将数据类型定义为x:Object的数据模板在处理不受支持的类型的数据时是极好的后备数据模板。

假设您有一个显示的屏幕,并通知用户如果他们导入的数据不受支持,他们将看到如下结果:然后显示x:Object的数据模板。一个简单的方法就是这样:

<x:Object></x:Object> 

以便可用的最具体的数据模板是x:Object one,这就是显示的内容。

Object类不包含有意义的数据,因此没有任何理由可以编写

function closePrint () {
  document.body.removeChild(this.__container__);
}

function setPrint () {
  this.contentWindow.__container__ = this;
  this.contentWindow.onbeforeunload = closePrint;
  this.contentWindow.onafterprint = closePrint;
  this.contentWindow.focus(); // Required for IE
  this.contentWindow.print();
}

function printPage (sURL) {
  var oHiddFrame = document.createElement("iframe");
  oHiddFrame.onload = setPrint;
  oHiddFrame.style.visibility = "hidden";
  oHiddFrame.style.position = "fixed";
  oHiddFrame.style.right = "0";
  oHiddFrame.style.bottom = "0";
  oHiddFrame.src = sURL;
  document.body.appendChild(oHiddFrame);
}

因为该类型没有内容。