如何从 Xamarin Forms UWP remove/replace 选择器下拉图标?

How to remove/replace picker dropdown icon from Xamarin Forms UWP?

我正在使用来自 PCL 项目的 Xamarin.Forms 选择器,但是在 Android 和 iOS 的情况下,选择器下拉图标不可用并且对于 UWP 选择器下拉-向下图标可用。

我得到了一个为 Android 和 iOS 平台 (https://xamgirl.com/picker-with-right-side-icon-in-xamarin-forms/) 添加选择器下拉图像的解决方案,我也需要对 UWP 使用相同的逻辑。所以我需要从 UWP picker(ComboBox) 中隐藏当前的下拉图标,并使用自定义图像更新图标。

我想从 UWP 中的选择器中删除下拉图标因此我遵循了这个 post -()

我不想在特定于平台的 App.xaml 文件中编写任何代码。 但是我需要从 自定义渲染器 class 中删除图标,有什么办法吗? 或者我需要使用来自 custom rendered class.

的自定义图像更新该图标

I don't want to write any code inside the platform-specific App.xaml file. But I need to remove the icon from custom renderer class,

根据您的要求,您可以为选择器制作自定义渲染。并找到带有 visualtreeheler 的下拉图标,然后将其 Visibility 设置为 Collapsed 以将其删除。或者给它具体的图表来改变它。

[assembly: ExportRenderer(typeof(Picker), typeof(CustomPickerRender))]
namespace BindablePicker.UWP
{
    public class CustomPickerRender : PickerRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.Loaded += Control_Loaded;

            }
        }

        private void Control_Loaded(object sender, RoutedEventArgs e)
        {
            var dropdown = MyFindChildByName(Control, "DropDownGlyph") as FontIcon;
            dropdown.Glyph = "\xE790";
          //dropdown.Visibility = Visibility.Collapsed;
        }

        public static DependencyObject MyFindChildByName(DependencyObject parant, string ControlName)
        {
            int count = VisualTreeHelper.GetChildrenCount(parant);

            for (int i = 0; i < count; i++)
            {
                var MyChild = VisualTreeHelper.GetChild(parant, i);
                if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
                    return MyChild;

                var FindResult = MyFindChildByName(MyChild, ControlName);
                if (FindResult != null)
                    return FindResult;
            }

            return null;
        }
    }
}

不过您可以使用此解决方案

<Frame Padding="10">
            <StackLayout>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="80*" />
                        <ColumnDefinition Width="20*" />
                    </Grid.ColumnDefinitions>
                    <Label Grid.Column="0" Text="{Binding Source={x:Reference MyPicker}, Path=SelectedItem.Title}" />
                    <Image Source="downdownpng.png" Grid.Column="1"/>
                </Grid>
                <Picker
                    x:Name="MyPicker"
                    ItemDisplayBinding="{Binding Title}"
                    ItemsSource="{Binding PickerItemSource}" />
                <StackLayout.GestureRecognizers>
                    <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped" />
                </StackLayout.GestureRecognizers>
            </StackLayout>
        </Frame>

在你的 .cs 中

private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
    {
        MyPicker.Focus();
    }