繁体   English   中英

如何使用 XAML 文件(Xamarin.Forms,Android)的 Resources 文件夹中的 Styles

[英]How to Use Styles from the Resources Folder in XAML Files (Xamarin.Forms, Android)

在我的项目中(仅适用于 Android),在 Resources/values/styles.xml 文件夹中,我使用以下代码创建了一个样式:

<style name="MyAppTheme" parent="@android:style/Theme.Holo.Light">    
    <item name="android:windowEnableSplitTouch">false</item>
    <item name="android:splitMotionEvents">false</item>
</style>

我想知道如何在 Resources 文件夹之外的 XAML 文件中使用它。

我计划在以下代码的最大网格中使用这种样式(禁用多点触控):

<?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:skia="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms"
             xmlns:tt="clr-namespace:TouchTracking.Forms;assembly=TouchTracking.Forms"
             x:Class="ToothScan.Views.FingerPaintPage"
             Title="Drawing"
             BackgroundColor="Gainsboro"
             Shell.FlyoutBehavior="Disabled">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

<Picker x:Name="colorPicker"
        Title="Color"
        Grid.Row="0"
        Grid.Column="0"
        Margin="10"
        BackgroundColor="DarkGray"
        FontSize="15"
        HorizontalTextAlignment="Center">
    <Picker.Items>
        <x:String>Red</x:String>
        <x:String>Green</x:String>
        <x:String>Blue</x:String>
        <x:String>Aqua</x:String>
        <x:String>Fuchsia</x:String>
        <x:String>Yellow</x:String>
        <x:String>Black</x:String>
        <x:String>Gray</x:String>
        <x:String>White</x:String>
    </Picker.Items>

    <Picker.SelectedIndex>
        0
    </Picker.SelectedIndex>
</Picker>
<Picker x:Name="widthPicker"
        Title="Width"
        Grid.Row="0"
        Grid.Column="1"
        Margin="10"
        BackgroundColor="DarkGray"
        FontSize="15"
        HorizontalTextAlignment="Center">
    <Picker.Items>
        <x:String>Thin (1 px)</x:String>
        <x:String>Thinish (2 px)</x:String>
        <x:String>Medium (5 px)</x:String>
        <x:String>Thickish (10 px)</x:String>
        <x:String>Thick (20 px)</x:String>
    </Picker.Items>

    <Picker.SelectedIndex>
        0
    </Picker.SelectedIndex>
</Picker>

<Button Text="Clear"
        x:Name="ClearBtn"
        Grid.Row="0"
        Grid.Column="2"
        HorizontalOptions="Center"
        VerticalOptions="Center"
        Clicked="OnClearButtonClicked"
        Margin="10"/>

<Grid Grid.Row="1"
      Grid.Column="0"
      Grid.ColumnSpan="3">

    <skia:SKCanvasView x:Name="canvasView"
                       PaintSurface="OnCanvasViewPaintSurface"/>
    <Grid.Effects>
        <tt:TouchEffect Capture="True"
                        TouchAction="OnTouchEffectAction"/>
    </Grid.Effects>
    </Grid>
</Grid>

如果您在 android 部分中使用 style.xml,则应用程序中的所有页面都将禁用多点触控。

因此,您可以尝试使用 ContentPage 自定义渲染器或 Grid 自定义渲染器来禁用页面或网格中的多点触控。 如:

public class MyPage : PageRenderer
{
    public MyPage(Context context) : base(context) { }
    protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
    {
        this.MotionEventSplittingEnabled = false;
        
        base.OnElementChanged(e);
    }
    public override bool DispatchTouchEvent(MotionEvent e)
    {
        return e.PointerCount ==1 && base.DispatchTouchEvent(e);
    }
}


public class MyGrid : ViewRenderer<Grid, Android.Widget.GridView>
{
    public MyGrid(Context context) : base(context) { }
    protected override void OnElementChanged(ElementChangedEventArgs<Grid> e)
    {
        base.OnElementChanged(e);
        Control.MotionEventSplittingEnabled = false;
    }
    public override bool DispatchTouchEvent(MotionEvent e)
    {
        return e.PointerCount == 1 && base.DispatchTouchEvent(e);
    }
}

我发布自己的有用信息。 我马上告诉你,我没有找到我使用XAML文件的变种,我已经找到了由于智能手机优化(在我的情况下是MIUI优化)导致绘图错误的情况的解决方案,来解决你只需在 MainActivity 中添加以下代码:

public override bool DispatchTouchEvent(MotionEvent e)
{
    try
       {
          return base.DispatchTouchEvent(e);
       }
    catch
       {
          return false;
       }
}

它将允许您拦截错误并且在发生错误的情况下无法识别触摸。

PS:错误会出现在 Visual Studio 中,但是在手机上使用该应用程序时,一切都会正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM