【问题标题】:How is it suggested to inherit from an implicit style in Xamarin.Forms XAML?建议如何从 Xamarin.Forms XAML 中的隐式样式继承?
【发布时间】:2016-08-30 18:17:50
【问题描述】:

我在继承自 Application ResourceDictionary 中定义的隐式样式时遇到了一些问题。我尝试了几种不同的方法,但每种方法都以一种或另一种形式不成功。

尝试1:继承隐式样式

应用程序资源字典

<Style TargetType="Button">
    <Setter Property="BackgroundColor" Value="#1386F1" />
    <Setter Property="TextColor" Value="White" />
    <Setter Property="FontAttributes" Value="Bold" />
    <Setter Property="HeightRequest">
      <OnPlatform x:TypeArguments="x:Double" iOS="30" Android="50" />
    </Setter>
    <Style.Triggers>
      <Trigger TargetType="Button" Property="IsEnabled" Value="False">
        <Setter Property="BackgroundColor">
          <OnPlatform x:TypeArguments="Color" iOS="#E8E8E8" />
        </Setter>
      </Trigger>
    </Style.Triggers>
</Style>

页面资源字典

<Style x:Key="LoginButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="BackgroundColor" Value="#024886" />
    <Setter Property="Margin">
      <OnPlatform x:TypeArguments="Thickness" iOS="0,5" />
    </Setter>
</Style>

页面控制

<Button Style="{StaticResource LoginButtonStyle}" />

结果

抛出异常“找不到键 {x:Type Button} 的静态资源”。这就是我记得在 WPF 中执行此操作的方式,但我假设 Xamarin XAML 不支持此操作。

尝试 2:继承通用显式样式

应用程序资源字典

<Style x:Key="DefaultButtonStyle" TargetType="Button">
    <!-- Same as Attempt 1 -->
</Style>
<!-- This implicit style causes issues with the inheritence of the Trigger in the above explicit style. When it's commented out, everything works fine. -->
<Style TargetType="Button" BasedOn="{StaticResource DefaultButtonStyle}" />

页面资源字典

<Style x:Key="LoginButtonStyle" TargetType="Button" BasedOn="{StaticResource DefaultButtonStyle}">
    <!-- Same as Attempt 1 -->
</Style>

页面控制

<!-- Same as Attempt 1 -->

结果

除触发器外,一切正常。但是,当我删除隐式样式时,触发器会神奇地再次开始工作。不过,我宁愿不必在每个 Button 上指定显式样式。我相信这只是一个错误,但我想在花时间准备错误报告之前确定一下。

有什么想法吗?

Question in Xamarin Forums

【问题讨论】:

  • 嗯,在 android 上,触发器正在工作。现在无法在 iOS 上验证它。作为一种解决方法(在每个按钮上声明触发器之前),您可以尝试使用行为。 developer.xamarin.com/guides/xamarin-forms/behaviors/creating
  • Android 上禁用按钮的默认背景已经是我在 iOS (#E8E8E8) 触发器中指定的颜色,所以我不确定它是否在那里工作。由于我仅将触发器应用于 iOS,因此我尚未测试它是否适用于 Android。
  • 我把它改成了洋红色,它也能正常工作:)
  • 如果您阅读源代码,您会看到它已实现。所以也许这是一个错误。 github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/…
  • 尝试 3:您是否尝试在代码中定义触发动作?

标签: xaml inheritance xamarin xamarin.forms


【解决方案1】:

首先,感谢您的精彩总结!

在我看来这是一个错误,可以通过一点技巧来预防:

<!-- Base Style -->
<Style x:Key="BaseButtonStyle" TargetType="Button">
    <!-- Define base button style... -->
</Style>

<!-- Implicit Style -->
<Style TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}"></Style>

<!-- Inherited Style -->
<Style x:Key="InheritedButtonStyle" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}">
    <!-- Extend base button style... -->
</Style>

基本上,这个想法是创建一个通用的显式基本样式,然后被隐式样式继承。因此,所有按钮都会自动应用 BaseButtonStyle,这也是可扩展的。

注意:隐式样式必须在定义基本样式后创建。

编辑:显然这是与之前已经提供的#2 相同的解决方案。所以,触发器问题没有修复,这似乎是一个错误。

【讨论】:

  • 感谢您的回答,但您能否具体说明您指的是哪个错误?您列出的代码与我在尝试 #2 中列出的代码相同,所以我看不到我提到的 Trigger 错误将如何通过您提供的内容来防止。
  • 哦,感谢您的澄清。抱歉,我监督我的解决方案与您的解决方案完全相同,因为我主要关注主要问题。由于我完全依赖数据绑定,我还没有意识到触发器不起作用。
猜你喜欢
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多