如何从 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();
}
我正在使用来自 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();
}