gpt4 book ai didi

c# - 如何覆盖/修改 Frame 的 Content 属性以接受 Xamarin.Forms 中的多个 View ?

转载 作者:行者123 更新时间:2023-12-03 15:04:28 24 4
gpt4 key购买 nike

这是 C# 我有模板代码:

public class PopupFrame : Frame
{
public PopupFrame()
{
this.SetDynamicResource(BackgroundColorProperty, "PopUpBackgroundColor");
this.SetDynamicResource(CornerRadiusProperty, "PopupCornerRadius");
HasShadow = true;
HorizontalOptions = LayoutOptions.FillAndExpand;
Padding = 0;
VerticalOptions = LayoutOptions.Center;
}
}
我是这样使用它的:
<t:PopupFrame>
<StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
<t:PopupHeader Text="Copy Deck" />
<t:PopupEntryHeader Text="New Deck Name" />

More XAML here
</StackLayout>
</t:PopupFrame>
有什么方法可以编码 PopupFrame使 StackLayout是其中的一部分,它需要内容。
这是我想编码的内容:
<t:PopupFrame>
<t:PopupHeader Text="Copy Deck" />
<t:PopupEntryHeader Text="New Deck Name" />

More XAML here

</t:PopupFrame>

最佳答案

如果我是对的,您可以通过设置 ContentProperty 来实现这一点。归因于您的 PopupFrame类到一个本身就是一个集合的属性。这将覆盖 ContentPropertyFrame这是 Content允许您将多个 View 设置为内容,而不仅仅是 Frame 的默认设置...
所以,如果这一切听起来不错,请继续阅读。
操作方法
你可以定义一个 ContentProperty为您 PopupFrame类,像这样:

[Xamarin.Forms.ContentProperty("Contents")]
class PopupFrame : Frame
{
StackLayout contentStack { get; } = new StackLayout();

public IList<View> Contents { get => contentStack.Children; }


public PopupFrame()
{
Content = contentStack;

HasShadow = true;
HorizontalOptions = LayoutOptions.FillAndExpand;
Padding = 0;
VerticalOptions = LayoutOptions.Center;
}
}
然后你就可以做你想做的事情:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:t="clr-namespace:popupframe"
x:Class="popupframe.MainPage">

<StackLayout>
<t:PopupFrame>
<t:PopupHeader Text="Test header"/>
<Label Text="Test content"/>
</t:PopupFrame>
</StackLayout>

</ContentPage>
我这边的作品同时显示了 PopupHeaderLabel :
enter image description here
最后是关于 ContentProperty 的一些理论
以下内容来自 book of Ch. Petzold on Xamarin.Forms .
中使用的每个类XAML 允许将一个属性定义为内容属性(有时也称为类的默认属性)。对于此内容属性,不需要属性元素标记,并且开始和结束标记中的任何 XML 内容都会自动分配给此属性。很方便,内容属性 ContentPageContent , StackLayout 的内容属性是 Children ,以及 Frame 的内容属性是 Content .
这些内容属性已记录在案,但您需要知道在哪里查看。类使用 ContentPropertyAttribute 指定其内容属性。如果此属性附加到类,则它会与类声明一起出现在在线 Xamarin.Forms API 文档中。以下是它在 ContentPage 的文档中的显示方式:
[Xamarin.Forms.ContentProperty("Content")]
public class ContentPage : TemplatedPage
如果你大声说出来,听起来有点多余:“Content 属性是 ContentPage 的内容属性。” Frame的声明类是类似的:
[Xamarin.Forms.ContentProperty("Content")]
public class Frame : ContentView
StackLayout没有 ContentProperty应用了属性,但 StackLayout源自 Layout<View> , 和 Layout<T>有一个 ContentProperty属性:
[Xamarin.Forms.ContentProperty("Children")]
public abstract class Layout<T> : Layout, IViewContainer<T>
where T : View
ContentProperty属性由派生自 Layout<T> 的类继承, 所以 ChildrenStackLayout 的内容属性.

关于c# - 如何覆盖/修改 Frame 的 Content 属性以接受 Xamarin.Forms 中的多个 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64843323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com