c# - Xamarin 按 Id 查找资源,然后按名称搜索
问题描述
我有这个跟随资源,我能够通过 Id 找到资源,但我找不到一些如何按名称查找子元素的方法
<ControlTemplate x:Key="MainPageTemplate">
<Grid
BackgroundColor="White"
HorizontalOptions="FillAndExpand"
RowSpacing="0"
VerticalOptions="FillAndExpand">
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="50" />
</Grid.ColumnDefinitions>
<StackLayout
Grid.Row="0"
Grid.Column="0"
BackgroundColor="Transparent"
HeightRequest="50"
VerticalOptions="CenterAndExpand"
WidthRequest="50">
<ffimageloadingsvg:SvgCachedImage
Margin="10,0"
HeightRequest="24"
HorizontalOptions="StartAndExpand"
Source="resource://ABSCardApp.Resources.ic_menu.svg"
VerticalOptions="CenterAndExpand"
WidthRequest="24" />
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Tapped="Button_Clicked" />
</StackLayout.GestureRecognizers>
</StackLayout>
<ffimageloadingsvg:SvgCachedImage
Grid.Row="0"
Grid.Column="1"
Margin="0,0,0,8"
HeightRequest="20"
X:Name="LogoIcon"
HorizontalOptions="StartAndExpand"
Source="resource://ABSCardApp.Resources.logo.svg"
VerticalOptions="CenterAndExpand"
WidthRequest="96" />
....
我正在使用以下代码来获取资源 ID
var resource = Application.Current.Resources["MainPageTemplate"];
但是我在这里被激怒了,因为我不能在这个结果上使用 FindByName 甚至将结果转换为ResourceDictionary
或ControlTemplate
作为resource.FindByName("LogoIcon")
我不确定我是否做得正确。
解决方案
正如 jason 所说,您必须将这些属性绑定到模型或视图模型上的属性 在模板中命名 UI 控件是没有意义的。
例如,您在 App.xaml 中有 controltemplate,您应该对 SvgCachedImage 源使用绑定。
<ControlTemplate x:Key="MainPageTemplate">
<Grid BackgroundColor="White" VerticalOptions="Center">
<ffimageloadingsvg:SvgCachedImage x:Name="LogoIcon" Source="{TemplateBinding BindingContext.Url}" />
<ContentPresenter />
</Grid>
</ControlTemplate>
现在,在许多内容页面中,您应该为此分配不同的值。
<ContentPage
x:Class="demo2.dictionary.Page1"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<ContentView
x:Name="contentView"
Padding="0,20,0,0"
ControlTemplate="{StaticResource MainPageTemplate}">
<StackLayout>
<Label
HorizontalOptions="CenterAndExpand"
Text="Welcome to Xamarin.Forms!"
VerticalOptions="CenterAndExpand" />
</StackLayout>
</ContentView>
public partial class Page1 : ContentPage, INotifyPropertyChanged
{
private string _Url;
public string Url
{
get { return _Url; }
set
{
_Url = value;
RaisePropertyChanged("Url");
}
}
public Page1 ()
{
InitializeComponent ();
Url = "a11.jpg";
this.BindingContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
如果我的回复解决了您的问题,请记得将回复标记为答案,谢谢。
推荐阅读
- azure - Azure 服务总线 - 描述逻辑
- python - 获取多索引熊猫系列级别内序列的第一个和最后一个元素
- c# - 将具有可变自定义数据的自定义属性附加到 PropertyGrid 中的类属性
- javascript - 我可以简单地用 Javascript 中的 Indexof 替换 Includes 吗?
- reactjs - 你能根据用户源ip隐藏一个html按钮吗
- python - 将时间戳和用户名添加到日志
- google-apps-script - 如何在 Google Apps 脚本中修复此脚本以创建带有邀请的日历活动?
- mysql - 有 3 列感兴趣,需要显示他们的图表,使用 MYSQL
- android-recyclerview - 如何使用来自 RecyclerView 元素的点击的导航组件?
- jquery - 事件不计算标记中的字符数