建议如何从 Xamarin.Forms XAML 中的隐式样式继承?

Tay*_*nan 7 inheritance xaml xamarin xamarin.forms

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

尝试一:继承隐式风格

应用资源字典

<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>
Run Code Online (Sandbox Code Playgroud)

页面资源字典

<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>
Run Code Online (Sandbox Code Playgroud)

页面控制

<Button Style="{StaticResource LoginButtonStyle}" />
Run Code Online (Sandbox Code Playgroud)

结果

引发异常“未找到键 {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}" />
Run Code Online (Sandbox Code Playgroud)

页面资源字典

<Style x:Key="LoginButtonStyle" TargetType="Button" BasedOn="{StaticResource DefaultButtonStyle}">
    <!-- Same as Attempt 1 -->
</Style>
Run Code Online (Sandbox Code Playgroud)

页面控制

<!-- Same as Attempt 1 -->
Run Code Online (Sandbox Code Playgroud)

结果

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

有任何想法吗?

Xamarin 论坛中的问题

dro*_*_91 4

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

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

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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