C# Xamarin.Forms自定义控件的制作方法是否与WPF/Desktop相同?

C# Xamarin.Forms自定义控件的制作方法是否与WPF/Desktop相同?,c#,xaml,xamarin.forms,custom-controls,C#,Xaml,Xamarin.forms,Custom Controls,很长一段时间以来,我一直在用C#和WPF构建桌面应用程序。可以肯定地说(这并不意味着我擅长于此),我知道如何使用以下代码(节略)构建自定义控件和所需的样式: 此样式也是经过删节的(在Themes/Generic.xaml文件中): 因此,我想学习如何开发一个跨平台的应用程序(Android和iOS),使用自定义控件,基本上具有相同的UI 我刚开始读它,但我想确定有可能创造出这样的东西 我如何用Xamarin.Forms实现这一点?可能吗?它与WPF有多大不同?我以前没有使用过WPF,但官方

很长一段时间以来,我一直在用C#和WPF构建桌面应用程序。可以肯定地说(这并不意味着我擅长于此),我知道如何使用以下代码(节略)构建自定义控件和所需的样式:

此样式也是经过删节的(在Themes/Generic.xaml文件中):



因此,我想学习如何开发一个跨平台的应用程序(Android和iOS),使用自定义控件,基本上具有相同的UI

我刚开始读它,但我想确定有可能创造出这样的东西


我如何用Xamarin.Forms实现这一点?可能吗?它与WPF有多大不同?

我以前没有使用过
WPF
,但官方网站上有一个详细的文档,通过将他们现有的知识和经验交叉引用到移动习惯用语,帮助
WPF
Windows窗体开发人员
Xamarin
学习移动应用程序开发,并提供了将桌面应用程序移植到移动设备的示例

这是文件:

这部分是在讨论

我想学习如何开发跨平台应用程序(Android和 iOS),具有自定义控件,基本上具有相同的UI

如果您使用Xamarin.forms,Android和iOS确实共享相同的UI


本文档是关于如何使用Xamarin的。那里有一些示例,您可以查看和学习。

那么,它们是否共享相同的UI,而不需要为每个平台定制渲染器?我在读有关它的文章,但我不确定它是Forms还是Android/iOS项目。哦,是的,看起来不需要自定义渲染器:奇怪的是,这一个使用渲染器:@NickeManarin Android和iOS项目在Xamarin.Forms中共享UI。但是,并非每个平台中的所有控件都相同。可以使用自定义渲染器自定义每个平台上Xamarin.forms控件的外观和行为。在每个平台上实现控件也有一些限制,在这种情况下,必须使用自定义渲染器来实现控件。大部分用户界面是共享的。
public class HexadecimalBox : ExtendedTextBox
{
    public static readonly DependencyProperty RedProperty = DependencyProperty.Register("Red", typeof(int), typeof(HexadecimalBox), new PropertyMetadata(0, Value_PropertyChanged));

    public int Red
    {
        get => (int)GetValue(RedProperty);
        set => SetValue(RedProperty, value);
    }

    static HexadecimalBox()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(HexadecimalBox), new FrameworkPropertyMetadata(typeof(HexadecimalBox)));
    }

    //Overrides, methods, events registered inside the OnApplyTemplate, etc.
}
<!--HexaDecimalBox Style-->
<Style TargetType="{x:Type n:HexadecimalBox}">
    <Setter Property="MaxLength" Value="9"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type n:HexadecimalBox}">
                <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" MinWidth="{TemplateBinding MinWidth}"
                        BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}" VerticalAlignment="{TemplateBinding VerticalAlignment}"
                        HorizontalAlignment="{TemplateBinding HorizontalAlignment}" SnapsToDevicePixels="True">
                    <ScrollViewer x:Name="PART_ContentHost" Focusable="False" HorizontalScrollBarVisibility="Hidden"
                                  VerticalScrollBarVisibility="Hidden" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Opacity" Value="0.7"/>
        </Trigger>
    </Style.Triggers>
</Style>