Listview 将TapGestureRecognitor应用于水平列表-Xamarin表单中的标签
我正在尝试将一些数字的水平列表作为ListView的一项,我已经完成了这项工作,看起来很不错 接下来,当我滚动任何项目的水平列表时,我希望自动选择水平列表中的中间一个,我希望选择的值显示在该项目的标签中,相应地,我希望其他水平列表也自动滚动并执行相同的操作(各个标签的所有值应分别保持其偏移值的差异) 这是一件棘手的事情,我知道手势识别器在这里会有所帮助,但我不知道在哪里以及如何实现它,因为我是xamarin的新手。。 我将在这里编写所有代码,将上面的屏幕截图作为输出Listview 将TapGestureRecognitor应用于水平列表-Xamarin表单中的标签,listview,xamarin.forms,uitapgesturerecognizer,gesture-recognition,horizontallist,Listview,Xamarin.forms,Uitapgesturerecognizer,Gesture Recognition,Horizontallist,我正在尝试将一些数字的水平列表作为ListView的一项,我已经完成了这项工作,看起来很不错 接下来,当我滚动任何项目的水平列表时,我希望自动选择水平列表中的中间一个,我希望选择的值显示在该项目的标签中,相应地,我希望其他水平列表也自动滚动并执行相同的操作(各个标签的所有值应分别保持其偏移值的差异) 这是一件棘手的事情,我知道手势识别器在这里会有所帮助,但我不知道在哪里以及如何实现它,因为我是xamarin的新手。。 我将在这里编写所有代码,将上面的屏幕截图作为输出 namespace Vie
namespace ViewsAndComponents
{
class LVItem : INotifyPropertyChanged
{
private double _offset;
private string _num;
public string Num
{
get { return _num; }
internal set
{
_num = value;
OnPropertyChanged("Num");
}
}
public double Offset
{
get { return _offset; }
internal set
{
_offset = value;
OnPropertyChanged("Offset");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public partial class SVInsideLVItem : ContentPage
{
ObservableCollection<LVItem> Items = new ObservableCollection<LVItem>();
ListView timePlannerLV;
Label tL;
public SVInsideLVItem()
{
InitializeComponent();
Items.Add(new LVItem() { Num = "label-1", Offset = 5 });
Items.Add(new LVItem() { Num = "label-2", Offset = 1 });
Items.Add(new LVItem() { Num = "label-3", Offset = 3 });
Items.Add(new LVItem() { Num = "label-4", Offset = 2 });
Items.Add(new LVItem() { Num = "label-5", Offset = 4 });
timePlannerLV = new ListView
{
// Source of data items.
ItemsSource = Items,
HasUnevenRows = true,
RowHeight = -1,
//each item; it must return a Cell derivative.)
ItemTemplate = new DataTemplate(() =>
{
Label numL = new Label()
{
TextColor = Color.Black,
HorizontalTextAlignment = TextAlignment.Start,
FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
};
numL.SetBinding<LVItems>(Label.TextProperty, indexer => indexer.Num);
List<int> items = new List<int>();
items.Add(1);
items.Add(2);
items.Add(3);
items.Add(4);
items.Add(5);
items.Add(6);
items.Add(7);
items.Add(8);
items.Add(9);
items.Add(10);
items.Add(11);
items.Add(12);
items.Add(13);
items.Add(14);
items.Add(15);
items.Add(16);
items.Add(17);
items.Add(18);
items.Add(19);
items.Add(20);
StackLayout sLayout = new StackLayout()
{
Orientation = StackOrientation.Horizontal,
};
for (int i = 0; i < items.Count; i++)
{
Label label = new Label()
{
HorizontalTextAlignment = TextAlignment.Center,
TextColor = Color.Black,
FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
};
label.Text = items[i].ToString();
sLayout.Children.Add(label);
}
ScrollView scroll = new ScrollView
{
Orientation = ScrollOrientation.Horizontal,
Content = new StackLayout
{
Children =
{
sLayout
}
}
};
AbsoluteLayout layout = new AbsoluteLayout();
AbsoluteLayout.SetLayoutFlags(numL, AbsoluteLayoutFlags.All);
AbsoluteLayout.SetLayoutBounds(numL, new Rectangle(0.2, 0.2, 0.8, 0.25));
AbsoluteLayout.SetLayoutFlags(scroll, AbsoluteLayoutFlags.All);
AbsoluteLayout.SetLayoutBounds(scroll, new Rectangle(0.3, 0.6, 0.8, 0.2));
layout.Children.Add(numL);
layout.Children.Add(scroll);
return new ViewCell
{
View = new StackLayout
{
Children =
{
layout,
new BoxView{HeightRequest=1,BackgroundColor=Color.Gray}
}
}
};
})
};
this.Content = new StackLayout
{
Children =
{
timePlannerLV
}
};
}
}
}
命名空间视图和组件
{
LVItem类:INotifyPropertyChanged
{
私人双U补偿;
私有字符串_num;
公共字符串数
{
获取{return\u num;}
内部集
{
_num=值;
OnPropertyChanged(“Num”);
}
}
公共双偏移
{
获取{return\u offset;}
内部集
{
_偏移量=值;
不动产变更(“抵销”);
}
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共分部类SVINDELVITEM:ContentPage
{
ObservableCollection Items=新的ObservableCollection();
ListView timePlannerLV;
标签tL;
公共项目
{
初始化组件();
添加(新的LVItem(){Num=“label-1”,偏移量=5});
添加(新的LVItem(){Num=“label-2”,Offset=1});
添加(新的LVItem(){Num=“label-3”,Offset=3});
添加(新的LVItem(){Num=“label-4”,Offset=2});
添加(新的LVItem(){Num=“label-5”,Offset=4});
timePlannerLV=新建列表视图
{
//数据项的来源。
ItemsSource=项目,
HasRows=true,
行高=-1,
//每个项目;它必须返回一个单元格导数。)
ItemTemplate=新数据模板(()=>
{
Label numL=新标签()
{
TextColor=Color.Black,
HorizontalTextAlignment=TextAlignment.Start,
FontSize=Device.GetNamedSize(NamedSize.Small,新标签())
};
SetBinding(Label.TextProperty,indexer=>indexer.Num);
列表项=新列表();
增加第(1)项;
增加(2)项;
增加(3)项;
增加第(4)项;
增加第(5)项;
增加第(6)项;
增加(7)项;
增加(8)项;
增加(9)项;
增加(10);
增加(11)项;
增加(12);
增加(13);
增加(14);
增加(15);
增加(16);
增加(17);
增加(18);
增加(19);
增加(20);
StackLayout sLayout=新的StackLayout()
{
方向=堆叠方向。水平,
};
对于(int i=0;i
任何帮助都将不胜感激。。提前谢谢..我不完全确定你想在这里做什么。。但您需要将手势识别器添加到生成的标签中。因此,添加如下内容:
Label label = new Label()
{
HorizontalTextAlignment = TextAlignment.Center,
TextColor = Color.Black,
FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
};
label.Text = items[i].ToString();
var gestureRecognizer = new TapGestureRecognizer {
TappedCallback = o => selectedLabel.Text = o,
NumberOfTapsRequired = 1
};
label.GestureRecognizers.Add (gestureRecognizer);
sLayout.Children.Add(label);
希望这能帮助你相处