Xamarin 有条件地显示在派生的 ControlTemplate ContentPresenter 中
Xamarin conditionally show in derived ControlTemplate ContentPresenter
不太找到我要找的东西。任何 android / iPhone 类型开发的新手,但确实具有 WPF 控件模板、样式和使用 xaml.
的经验
这是我正在尝试完成但无法完全让它与绑定一起工作的示例图像。我有一个控制模板,可以给我顶部图像。顶部的 header/label 和右侧的 3 个按钮,然后是 "ContentPresenter"。这些都独立于它们定义的基础 class 。 (为 post 简化的控制模板)
<ControlTemplate x:Key="MyCommonTemplate" >
<StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="{TemplateBinding Title}" />
<Button Text="x" />
<Button Text="y" />
<Button Text="z" />
</StackLayout>
<ContentPresenter/>
</StackLayout>
</ControlTemplate>
<Style TargetType="{x:Type myApp:MyCommonControl}" x:Key="MyCommonStyle">
<Style.Setters>
<Setter Property="ControlTemplate" Value="{StaticResource MyCommonTemplate}" />
</Style.Setters>
</Style>
现在,顶部示例模板下方的两张图片。这些中的每一个都派生自顶级模板,但是它们中的每一个都有自己的内部内容,其中表示内容呈现器。如图所示,第一个派生控件始终显示其内容,但在第二个派生控件中,它有两个部分。一个始终显示,另一个有条件地显示。
这将代表来自同一控件模板的第一个派生控件。 Content Presenter 确实正确反映了图像显示的内部内容
<?xml version="1.0" encoding="UTF-8"?>
<myApp:MyCommonControl
x:Class="MyApp.MySubControl1"
...
xmlns:myapp="clr-namespace:MyApp">
<!-- This properly shows within the "ContentPresenter" as expected -->
<StackLayout>
<Label Text="Always show..." />
<Label Text="for this..." />
</StackLayout>
</myApp:MyCommonControl>
现在,第二个派生控件
<?xml version="1.0" encoding="UTF-8"?>
<myApp:MyCommonControl
x:Class="MyApp.MySubControl2"
...
xmlns:myapp="clr-namespace:MyApp">
<!-- This properly shows within the "ContentPresenter" as expected -->
<StackLayout>
<Label Text="Different sub-panel..." />
<Label Text="Always show..." />
</StackLayout>
<StackLayout IsVisible="{TemplateBinding OkToShowThis}">
<Label Text="This secondary sub-panel..." />
<Label Text="Based on..." />
</StackLayout>
</myApp:MyCommonControl>
"MyCommonControl"的实际基数class有多种
public static readonly BindableProperty…
其中一个是bool数据类型"OkToShowThis"。对于顶部标签和公共按钮区域,它们都分别识别出在适当的时候从可见变为隐藏,所以我知道它们有效。
我的问题是从基本控件模板的 "ContentPresenter" 填充的派生控件的问题。此子控件的 "OkToShowThis" 未刷新。在这种情况下不确定正确的绑定参考。
感谢任何帮助。
解决方案欣赏
感谢 Leo Zhu 提供的解决方案,我的解释是这样的。
最外面的 xaml 其中
x:Name=myCommonControl
指的是 class 创建的特定实例。然后,我可以通过
将特定的 INNER CONTROL 绑定到该对象
<StackLayout BindingContext="{x:Reference Name=myCommonControl}"
现在我已经正确绑定到 "Name=myCommonControl" 已知的 class 实例,我可以引用 class 实例中的任何 属性 从而完成我的需要通过
<StackLayout BindingContext="{x:Reference Name=myCommonControl}"
IsVisible="{Binding OkToShowThis}">
并且内部控件将按预期动态 show/hide。
非常感谢。
首先在您的 MyCommonControl 中您可以定义 BindableProperty OkToShowThis
:
public static readonly BindableProperty OkToShowThisProperty = BindableProperty.Create("OkToShowThis", typeof(bool), typeof(MyCommonControl), true);
public bool OkToShowThis
{
get { return (bool)GetValue(OkToShowThisProperty); }
}
然后在你的第二个派生控件中:
<?xml version="1.0" encoding="UTF-8"?>
<myApp:MyCommonControl
x:Class="MyApp.MySubControl2"
...
xmlns:myapp="clr-namespace:MyApp"
OkToShowThis ="False"
x:Name="myCommonControl"
>
<!-- This properly shows within the "ContentPresenter" as expected -->
<StackLayout>
<Label Text="Different sub-panel..." />
<Label Text="Always show..." />
<StackLayout BindingContext="{x:Reference Name=myCommonControl}" IsVisible="{Binding OkToShowThis}">
<Label Text="This secondary sub-panel..." />
<Label Text="Based on..." />
</StackLayout>
</StackLayout>
这是你想要的吗?
不太找到我要找的东西。任何 android / iPhone 类型开发的新手,但确实具有 WPF 控件模板、样式和使用 xaml.
的经验这是我正在尝试完成但无法完全让它与绑定一起工作的示例图像。我有一个控制模板,可以给我顶部图像。顶部的 header/label 和右侧的 3 个按钮,然后是 "ContentPresenter"。这些都独立于它们定义的基础 class 。 (为 post 简化的控制模板)
<ControlTemplate x:Key="MyCommonTemplate" >
<StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="{TemplateBinding Title}" />
<Button Text="x" />
<Button Text="y" />
<Button Text="z" />
</StackLayout>
<ContentPresenter/>
</StackLayout>
</ControlTemplate>
<Style TargetType="{x:Type myApp:MyCommonControl}" x:Key="MyCommonStyle">
<Style.Setters>
<Setter Property="ControlTemplate" Value="{StaticResource MyCommonTemplate}" />
</Style.Setters>
</Style>
现在,顶部示例模板下方的两张图片。这些中的每一个都派生自顶级模板,但是它们中的每一个都有自己的内部内容,其中表示内容呈现器。如图所示,第一个派生控件始终显示其内容,但在第二个派生控件中,它有两个部分。一个始终显示,另一个有条件地显示。
这将代表来自同一控件模板的第一个派生控件。 Content Presenter 确实正确反映了图像显示的内部内容
<?xml version="1.0" encoding="UTF-8"?>
<myApp:MyCommonControl
x:Class="MyApp.MySubControl1"
...
xmlns:myapp="clr-namespace:MyApp">
<!-- This properly shows within the "ContentPresenter" as expected -->
<StackLayout>
<Label Text="Always show..." />
<Label Text="for this..." />
</StackLayout>
</myApp:MyCommonControl>
现在,第二个派生控件
<?xml version="1.0" encoding="UTF-8"?>
<myApp:MyCommonControl
x:Class="MyApp.MySubControl2"
...
xmlns:myapp="clr-namespace:MyApp">
<!-- This properly shows within the "ContentPresenter" as expected -->
<StackLayout>
<Label Text="Different sub-panel..." />
<Label Text="Always show..." />
</StackLayout>
<StackLayout IsVisible="{TemplateBinding OkToShowThis}">
<Label Text="This secondary sub-panel..." />
<Label Text="Based on..." />
</StackLayout>
</myApp:MyCommonControl>
"MyCommonControl"的实际基数class有多种
public static readonly BindableProperty…
其中一个是bool数据类型"OkToShowThis"。对于顶部标签和公共按钮区域,它们都分别识别出在适当的时候从可见变为隐藏,所以我知道它们有效。
我的问题是从基本控件模板的 "ContentPresenter" 填充的派生控件的问题。此子控件的 "OkToShowThis" 未刷新。在这种情况下不确定正确的绑定参考。
感谢任何帮助。
解决方案欣赏
感谢 Leo Zhu 提供的解决方案,我的解释是这样的。 最外面的 xaml 其中
x:Name=myCommonControl
指的是 class 创建的特定实例。然后,我可以通过
将特定的 INNER CONTROL 绑定到该对象<StackLayout BindingContext="{x:Reference Name=myCommonControl}"
现在我已经正确绑定到 "Name=myCommonControl" 已知的 class 实例,我可以引用 class 实例中的任何 属性 从而完成我的需要通过
<StackLayout BindingContext="{x:Reference Name=myCommonControl}"
IsVisible="{Binding OkToShowThis}">
并且内部控件将按预期动态 show/hide。 非常感谢。
首先在您的 MyCommonControl 中您可以定义 BindableProperty OkToShowThis
:
public static readonly BindableProperty OkToShowThisProperty = BindableProperty.Create("OkToShowThis", typeof(bool), typeof(MyCommonControl), true);
public bool OkToShowThis
{
get { return (bool)GetValue(OkToShowThisProperty); }
}
然后在你的第二个派生控件中:
<?xml version="1.0" encoding="UTF-8"?>
<myApp:MyCommonControl
x:Class="MyApp.MySubControl2"
...
xmlns:myapp="clr-namespace:MyApp"
OkToShowThis ="False"
x:Name="myCommonControl"
>
<!-- This properly shows within the "ContentPresenter" as expected -->
<StackLayout>
<Label Text="Different sub-panel..." />
<Label Text="Always show..." />
<StackLayout BindingContext="{x:Reference Name=myCommonControl}" IsVisible="{Binding OkToShowThis}">
<Label Text="This secondary sub-panel..." />
<Label Text="Based on..." />
</StackLayout>
</StackLayout>
这是你想要的吗?