我创建了一个控件,其中包含一组听取触摸事件的标签(选择其中一个;' SelectList')。当我将这个控件嵌入我的一个页面时,一切正常。
但是,我创建了一个控件,用作任何其他视图/控件的容器,并使用alpha蒙版隐藏它的一部分。 当我将SelectList放在这个容器中时,除了标签都是不可见的外,所有内容都应该完全正确!事实证明,他们的宽度和高度从未设置(都保持在-1)。
它现在的工作方式是SelectList是一个包含带标签的StackLayout的RelativeLayout。容器是一个带有内容属性句柄的视图,然后自定义渲染器使用我在网上找到的一个小扩展方法片段将其转换为本机UIView后屏蔽它:
public static UIView ConvertToNative(this View view, CGRect size)
{
var renderer = Platform.CreateRenderer(view);
renderer.NativeView.Frame = size;
renderer.Element.Layout(size.ToRectangle());
renderer.NativeView.SetNeedsLayout();
return renderer.NativeView;
}
无论我做什么,标签都没有分配给他们的尺寸(我已经在SizeChanged事件和很多不相关的地方尝试了Layout / ForceLayout以确定)。手动设置宽度和高度请求会使标签显示出来,但这似乎是一个黑客而不是一个正确的解决方案。
编辑:我也认为值得一提的是,包含标签的StackLayout的大小似乎是正常的。此外,由于样式限制,在此方案中使用ListView不是一个选项。
答案 0 :(得分:1)
按如下方式更改PopupView:
public class PopupView : ContentView
{
//public readonly View Content;
public PopupView(View content)
{
if (content == default(View))
{
throw new ArgumentNullException(nameof(content));
}
Content = content;
}
}
我还在标签顶部显示了您的方框。添加标签后添加。
private void Test3()
{
var selectList = GenerateSimpleSelectList();
var boxView = new BoxView() { Color = Color.Purple };
selectList.Children.Add(boxView,
Constraint.RelativeToParent((p) => { return p.X + 200; }),
Constraint.RelativeToParent((p) => { return p.Y + 200; }),
Constraint.RelativeToParent((p) => { return p.Width - 200; }),
Constraint.RelativeToParent((p) => { return p.Height - 200; }));
var popupView = new PopupView(selectList);
this.Content = popupView;
}