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

2024-01-23

我有一个按钮正在查看 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>

我尝试将 Based On="{StaticResource MyDefaultButtonStyleName}" 添加到样式标记,但它在运行时崩溃。

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

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

编辑:更新了代码示例。 我在 OKButtonStyle 上收到一条错误消息“无法将元素添加到属性“资源”,因为如果该属性使用显式集合标记,则该属性只能有一个子元素。标记文件中的对象“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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 无法使用 Xcode 10 在 Mojave 上安装brew

    我无法在我的 Mac 上安装任何 BREW 软件包 并出现以下错误信息 安装在我的 Mac 上 macOS 10 14 测试版 18A293u Xcode 9 3 9E145 Xcode 10 0 测试版 10L176w Type in b
  • 扩展WPF工具包RichTextBox垂直显示文本

    我正在尝试通过其 Text 属性将丰富内容 RTF 格式 绑定到富文本框 扩展 WPF Toolkit 如下所示
  • NodeJS 需要('..')?

    我一直在查看一些 NodeJS 示例 遇到以下情况 var module require var module require 我明白 require 的作用 但不明白这样写时它的作用是什么 有人可以向我解释一下吗 这是定义在https n
  • Javascript:如何获取函数内的父键?

    我有一些函数 存储在集合 数组中 并且希望获取密钥 函数名称 而不重新输入它 有没有什么捷径可以访问它 var functions collection function x function var name function x nam
  • IO Monad 在什么意义上是纯粹的?

    我已经将 IO monad 描述为 State monad 其中状态是 现实世界 这种 IO 方法的支持者认为 这使得 IO 操作变得纯粹 就像引用透明一样 这是为什么 从我的角度来看 IO monad 内部的代码似乎有很多可观察到的副作用
  • 更改嵌套转发器内下拉列表的选定值

    我尝试从 C 代码更改下拉列表选定的值
  • HTML 5中是不是不需要像HTML那样关闭标签呢?

    HTML 5中是不是不需要像HTML那样关闭标签呢 或者是 W3C 验证器中的错误 为什么此代码在 W3C 验证器中有效 p Some Text 如果它在 HTML5 中真的有效 我会感到惊讶 但是在 HTML5 中保持这种行为有效有什么好
  • 如何共享 Maven 原型?

    我创建了一个 Maven 原型 我想在我的公司内分享它 为此 我将其部署到我们的 Nexus 服务器上 并且可以从那里使用它 但这有点不方便 因为它似乎不在其他计算机上已知原型的目录中 解决方法是像这样使用它 mvn archetype g
  • 如何使用 firestore 运行地理“附近”查询?

    Firebase 中的新 Firestore 数据库本身支持基于位置的地理查询吗 即查找 10 英里内的帖子 或查找 50 个最近的帖子 我看到有一些现有的实时 firebase 数据库项目 例如 geofire 这些项目也可以适用于 fi
  • 将 JavaFX WebView 调整为文档正文所需的最小大小

    我正在为我的项目编写一个 JavaFX 自定义对话框 我需要一种变体但快速的模式来显示对话框内容 我了解controlsFX 实际上我正在使用它 但我想在 WebView 中显示内容 这样它会更可控 问题是关于 WebView 的大小我想找
  • C 有字符串类型吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我最近从 Java 和 Python
  • 有什么理由使用 threading.Lock 而不是 multiprocessing.Lock 吗?

    如果一个软件项目支持多处理已反向移植到的 Python 版本 是否有任何理由使用threading Lock over multiprocessing Lock 会一个multiprocessing锁也不是线程安全的吗 就此而言 是否有理由
  • 如何清理 React 事件处理程序中的 setTimeout/setInterval ?

    我怎样才能清理像这样的函数setTimeout or setInterval在 React 的事件处理程序中 还是说没有必要这样做 import React from react function App return
  • 无法连接到 MongoDB errno:61

    我使用 macports 安装了 MongoDB 并尝试运行mongo命令以启动 mongo shell 我收到以下错误 warning Failed to connect to 127 0 0 1 27017 reason errno 6
  • Lua - 执行存储在表中的函数

    我能够将函数存储到表中 但现在我不知道如何调用它们 最终表将有大约 100 个调用 因此如果可能的话 我想像在 foreach 循环中一样调用它们 谢谢 该表的定义方式如下 game level hints game level hints
  • Sikuli - 切换监视器和分辨率使脚本无效

    我确实经常在笔记本电脑屏幕和外部 24 英寸显示器之间切换 并且我确实注意到 如果我在笔记本电脑上拍摄快照 那么如果我在连接到 24 英寸显示器时运行脚本 测试将不再正常工作 如果我反过来 从 24 英寸显示器上拍摄快照 然后在笔记本电脑显
  • openssl.cnf 文件的正确位置

    我有一个Ubuntu系统 并且已经安装了OpenSSL 现在我想更改配置文件 我搜索了我的文件夹并找到了配置文件的以下位置 我应该使用哪一个来进行更改的主要 正确的 我需要在这里添加一个引擎 任何帮助 将不胜感激 以下是地点 usr loc
  • 有哪些算法可以比较两个字符串的相似程度?

    我需要比较字符串来确定它们是否代表相同的东西 这与人类输入的案例标题有关 其中缩写和其他小细节可能有所不同 例如 考虑以下两个标题 std string first Henry C Harper v The Law Offices of H
  • 在没有安装jruby的情况下在tomcat上执行rake任务

    我的 Rails 项目在 Warbler 的帮助下部署到 tomcat 但我需要能够在该服务器上运行 rake 任务 敬请关注 我希望在Warbler 1 4中有这个功能 社区成员 Jake Goulding 在这方面做了一些出色的工作 在
  • WPF 按钮 IsEnabled 基于 ComboBox 选择覆盖默认样式

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