基于 ComboBox 选择覆盖默认样式的 WPF 按钮 IsEnabled

标签 wpf xaml styles isenabled

我有一个 Button 正在查看 2 个组合框,以确保它们在启用之前具有值。问题是我这样做的方式是覆盖我的主题项目中声明的默认样式。

<Button x:Name="btnOK" VerticalAlignment="Center" Content="OK" IsDefault="True"  Margin="0" Click="btnOK_Click">
                    <Button.Style>
                      <Style BasedOn="{StaticResource DefaultButton}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding ElementName=ddlWageTypes, Path=SelectedItem}" Value="{x:Null}">
                                    <Setter Property="Button.IsEnabled" Value="false"/>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding ElementName=ddlJobTitles, Path=SelectedItem}" Value="{x:Null}">
                                    <Setter Property="Button.IsEnabled" Value="false"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Button.Style>
                </Button>

我试过将 BasedOn="{StaticResouce MyDefaultButtonStyleName}"添加到 style 标签,但它在运行时爆炸了。

错误是“无法将‘System.Windows.Style’值分配给对象‘System.Windows.Controls.Button’的属性‘Style’。只能基于目标类型为‘IFrameworkInputElement’的样式。错误在标记文件中的对象“System.Windows.Style”处”

是否可以在 XAML 中执行此操作而不覆盖默认样式。

编辑:代码示例已更新。
我在 OKButtonStyle 上收到一条错误消息,说“无法将元素添加到属性 'Resources',因为如果使用显式集合标记,该属性只能有一个子元素。标记文件中的对象 'System.Windows.Style' 处出错”
<UserControl x:Class="UK.Budgeting.XBAP.ShiftDiff.NewFTEPremiumPaySummary"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:compModel="clr-namespace:System.ComponentModel;assembly=WindowsBase"
    xmlns:local="clr-namespace:UK.Budgeting.XBAP.ShiftDiff">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="CellTemplates.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

      <Style TargetType="{x:Type Button}" x:Key="OKButtonStyle" BasedOn="{StaticResource DefaultButton}">
        <Style.Triggers>
          <DataTrigger Binding="{Binding ElementName=ddlWageTypes, Path=SelectedItem}" Value="{x:Null}">
            <Setter Property="Button.IsEnabled" Value="false"/>
          </DataTrigger>
          <DataTrigger Binding="{Binding ElementName=ddlJobTitles, Path=SelectedItem}" Value="{x:Null}">
            <Setter Property="Button.IsEnabled" Value="false"/>
          </DataTrigger>
        </Style.Triggers>
      </Style>

    </UserControl.Resources>
    <Grid>
        <Rectangle Style="{StaticResource DialogRectangle}"/>
        <Border Style="{StaticResource DialogBorder}">
            <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Background="White">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="5"/>
                    <ColumnDefinition MinWidth="300"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="2"/>
                    <RowDefinition/>
                    <RowDefinition Height="2"/>
                    <RowDefinition/>
                    <RowDefinition Height="2"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>

                <TextBlock Grid.Column="0" Grid.Row="0" Style="{StaticResource LabelStyle}">Wage Type</TextBlock>
                <TextBlock Grid.Column="0" Grid.Row="2" Style="{StaticResource LabelStyle}">Job Title</TextBlock>

                <ComboBox x:Name="ddlWageTypes" VerticalAlignment="Top" Grid.Column="2" Grid.Row="0"
                          DisplayMemberPath="DisplayName"
                          SelectedValuePath="WageTypeCode"/>
                <ComboBox x:Name="ddlJobTitles" VerticalAlignment="Top" Grid.Column="2" Grid.Row="2"
                          DisplayMemberPath="JobTitle"
                          SelectedValuePath="JobCode"/>

                <StackPanel Grid.Column="2" Grid.Row="6" VerticalAlignment="Top" Orientation="Horizontal" Margin="5">
                  <Button x:Name="btnOK" VerticalAlignment="Center" Content="OK" IsDefault="True"  Margin="0" Click="btnOK_Click" Style="{StaticResource OKButtonStyle}"/>
                    <Button x:Name="btnCancel" VerticalAlignment="Center" Content="Cancel" IsCancel="True" Margin="10,0,0,0" Click="btnCancel_Click"/>
                </StackPanel>
            </Grid>
        </Border>
    </Grid>
</UserControl>

最佳答案

这怎么样

BasedOn="{StaticResouce DefaultButton}"

应该引用默认按钮样式?这会崩溃,因为 DefaultButton 是您的应用程序中未定义的资源。

它应该是:
BasedOn="{StaticResource {x:Type Button}}"

编辑:对不起,回答太仓促了。

我注意到现在您的按钮设置了 Style={},并且指向一个名为 OkBUttonStyle 的样式。这是应该定义一切并基于默认按钮样式的样式。总而言之,我包括了这些触发器。您在 XAML 中所说的是样式是按钮的内容。

也许一些代码会有所帮助:
 <Window x:Class="WindowsApplication7.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WindowsApplication7" Height="300" Width="300"
    >
  <Window.Resources>
    <Style TargetType="{x:Type Button}" x:Key="defaultButtonStyle">
      <Setter Property="Background" Value="Red" />
    </Style>

    <Style TargetType="{x:Type Button}" x:Key="okButtonStyle" BasedOn="{StaticResource defaultButtonStyle}">
      <Setter Property="Foreground" Value="Green" />
      <Style.Triggers>
        <Trigger Property="IsEnabled" Value="True">
          <Setter Property="Background" Value="Yellow" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
          <Setter Property="Foreground" Value="Blue" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </Window.Resources>
  <StackPanel>
    <Button>System default</Button>
    <Button Style="{StaticResource defaultButtonStyle}">My Default</Button>
    <Button Style="{StaticResource okButtonStyle}">Ok</Button>
    <Button Style="{StaticResource okButtonStyle}" IsEnabled="False">Ok disabled</Button>
  </StackPanel>
</Window>

关于基于 ComboBox 选择覆盖默认样式的 WPF 按钮 IsEnabled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/371879/

相关文章:

wpf - 自定义 WPF ComboBox 不显示分组

c# - 具有自定义和默认先决条件的 Clickonce WPF 应用程序

c# - WPF XamDataGrid 在离开当前单元格之前不会更新

xaml - Expression Blend 会让我免于学习 xaml 吗?

java - 如何更改、覆盖或切断 Tapestry 默认样式?

html - mvc 5 @html.editorfor 类不适合父宽度

wpf - 无法绑定(bind)到我的 ViewModel 的集合

wpf - 如何将嵌入的图像资源分配给 XAML 中的图像控件

c# - System.Xaml 和 System.Windows.Markup 的 Xaml 阅读器之间的区别?

c# - TextBlock 重写样式的奇怪行为